Bash 如果多个模式匹配,则打印多个字段

Bash 如果多个模式匹配,则打印多个字段,bash,awk,grep,Bash,Awk,Grep,我有一个逗号分隔的文件,如下所示 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 文件中的一行可以包含 (1) 只有“价值” (2) 仅“原始价值” (3) “原始值”和“修正值” 这些值可以在任何列中 我编写的以下awk命令在模式匹配后只能打印一个字段 cat file

我有一个逗号分隔的文件,如下所示

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
文件中的一行可以包含 (1) 只有“价值” (2) 仅“原始价值” (3) “原始值”和“修正值”

这些值可以在任何列中

我编写的以下awk命令在模式匹配后只能打印一个字段

cat file | awk -F, 'BEGIN{OFS=","} /value/ { for (x=1;x<=NF;x++) if ($x~"value") {print $2,$3,$(x)} }' | sort -u
如果出现两个模式匹配,如何打印一行的两个字段(列)?在这种情况下,如果原始_值和更正的_值都存在

预期产出

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
category=a,type=b,value=1
category=b,type=c,original_value=1,corrected_value=3
category=c,type=b,original_value=0

Bash版本:4.3.11

您可以使用此
awk
命令:

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

awk'BEGIN{FS=OFS=“,”}{printf”%s%s%s“,$2,OFS$3;对于(i=4;i您可以使用此
awk
命令:

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

awk'BEGIN{FS=OFS=“,”}{printf”%s%s%s“,$2,OFS$3;for(i=4;i类似于@anubhava的答案,但不依赖于特定列中的类别或类型:

 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
awk-F,'
开始{pattern=“^(类别|类型|值|原始|校正|值)}
{
sep=“”

对于(i=1;i,类似于@anubhava的答案,但不依赖于特定列中的类别或类型:

 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
awk-F,'
开始{pattern=“^(类别|类型|值|原始|校正|值)}
{
sep=“”
对于(i=1;i