【问题标题】:print multiple fields if multiple pattern matches如果多个模式匹配,则打印多个字段
【发布时间】:2017-07-18 06:15:22
【问题描述】:

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

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

如果出现两个模式匹配,我如何打印一行的两个字段(列)?在这种情况下,如果 original_value 和corrected_value 都存在。

预期输出

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

【问题讨论】:

    标签: bash awk grep


    【解决方案1】:

    你可以使用这个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
    

    【讨论】:

      【解决方案2】:

      类似于@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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-08
        • 2014-08-28
        • 2019-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多