pdna
pdna

Reputation: 602

print multiple fields if multiple pattern matches

I have a comma delimited file like below

0,category=a,type=b,value=1
1,category=c,type=b,.....,original_value=0
2,category=b,type=c,....,original_value=1,....,corrected_value=3

A line in the file can contain (1)only 'value' (2)only 'original_value' (3)both 'original value' and 'corrected_value'

The values can be in any column.

The following awk command I wrote can only print one field after pattern match.

cat file | awk -F, 'BEGIN{OFS=","} /value/ { for (x=1;x<=NF;x++) if ($x~"value") {print $2,$3,$(x)} }' | sort -u

Current Output:

category=a,type=b,value=1
category=b,type=c,corrected_value=3
category=b,type=c,original_value=1
category=c,type=b,original_value=0

How do I print two fields (columns) of a line if two pattern matches occur? In this case, if both original_value and corrected_value exist.

Expected Output:

category=a,type=b,value=1
category=b,type=c,original_value=1,corrected_value=3
category=c,type=b,original_value=0

Bash Version: 4.3.11

Upvotes: 1

Views: 935

Answers (2)

glenn jackman
glenn jackman

Reputation: 246764

Similar to @anubhava's answer, but does not rely on the category or type being in a particular column:

 awk -F, '
    BEGIN { pattern = "^(category|type|value|original_value|corrected_value)" }
    {
        sep = ""
        for (i=1; i<=NF; i++) {
            if ($i ~ pattern) {
                printf "%s%s", sep, $i
                sep = ","
            }
        }
        print ""
    }
' file

Upvotes: 2

anubhava
anubhava

Reputation: 784998

You can use this awk command:

awk 'BEGIN{FS=OFS=","} {printf "%s%s%s", $2,OFS,$3; for(i=4; i<=NF; i++)
     if ($i ~ /value/) printf "%s%s", OFS,$i; print ""}' file

category=a,type=b,value=1
category=c,type=b,original_value=0
category=b,type=c,original_value=1,corrected_value=3

Upvotes: 2

Related Questions