如何仅打印具有特定值的列

时间:2015-04-27 20:50:26

标签: shell awk gawk

我有一个带有列分隔值的文件,第一行在这里显示为具有实际数据的下一行的列标题。实际的列数比这个例子要长得多,顺便说一下,这就是为什么我想自动完成我需要做的工作。

main-cat    ID  AFFIL   PERM    FF  PLAN    
ACA yes EDU yes no  no
ACA yes EDU no  yes no
ACA yes EDU no  no  yes

我需要的是为每一行提取值不是" no"的那些列。此外,我希望以格式打印这样一个列:

列标题=行值

示例:上面的三个示例行应打印为:

main-cat=ACA ID=yes AFFIL=EDU PERM=yes 
main-cat=ACA ID=yes AFFIL=EDU FF=yes
main-cat=ACA ID=yes AFFIL=EDU PLAN=yes 

我最好的建议是无穷无尽的条件列表(有很多列),如果column1不是" no",则打印" main-cat =" + row-值,如果第2列不是"否",则打印" ID =" +行值。但肯定必须有一种更有效的方法来实现这一目标吗?我使用(g)awk和/或shell脚本。 将不胜感激任何建议。

2 个答案:

答案 0 :(得分:2)

我说

awk 'NR == 1 { split($0, colnames); next } { sep = ""; for(i = 1; i <= NF; ++i) if($i != "no") { printf("%s%s=%s", sep, colnames[i], $i); sep = OFS } print "" }' filename

那是

NR == 1 {                                      # in the first line
  split($0, colnames)                          # remember column names
  next                                         # do nothing else
}
{                                              # in all other lines:
  sep = ""                                     # reset separator token
  for(i = 1; i <= NF; ++i) {                   # wade through fields
    if($i != "no") {                           # for those that aren't "no"
      printf("%s%s=%s", sep, colnames[i], $i)  # print them with the remem-
                                               # bered column name
      sep = OFS                                # set sep to OFS here so that
                                               # the fields will have a
                                               # separator in front, starting
                                               # with the second
    }
  }
  print ""                                     # when done, add newline.
}

答案 1 :(得分:0)

这对我有用:

c:\> gawk -f temp.awk temp_in.txt
 main-cat=ACA ID=yes AFFIL=EDU PERM=yes
 main-cat=ACA ID=yes AFFIL=EDU FF=yes
 main-cat=ACA ID=yes AFFIL=EDU PLAN=yes

c:\>

根据您的输入文件,它会生成您寻找的输出:

Await vCol.InsertOneAsync(vAddUser)