我有一个带有列分隔值的文件,第一行在这里显示为具有实际数据的下一行的列标题。实际的列数比这个例子要长得多,顺便说一下,这就是为什么我想自动完成我需要做的工作。
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脚本。 将不胜感激任何建议。
答案 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)