Shell 如何仅打印具有特定值的列
我有一个带有列分隔值的文件,第一行显示为列标题,下一行显示实际数据。实际的列集合比本例中的要长得多,顺便说一句,这就是为什么我想自动化我需要做的工作Shell 如何仅打印具有特定值的列,shell,awk,gawk,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 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
我最好的建议是列出无数的条件(有很多列),如果第1列不是“否”,则打印“main cat=“+行值”,如果第2列不是“否”,则打印“ID=“+行值”。但肯定有更有效的方法来实现这一点吗?我使用(g)awk和/或shell脚本。
如果您有任何建议,我将不胜感激。我想说
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
awk'NR==1{split($0,colnames);next}{sep=“”;for(i=1;i这对我有效:
NR == 1 {
for (i = 1; i <= NF; i++) {
title[i] = $i
}
next
}
{
for (i = 1; i <= NF; i++) {
if ($i != "no") {
printf(" %s=%s", title[i], $i)
}
}
printf("\n")
}
如果所有字段都是“否”,您希望打印什么?一个空行?什么都没有?其他什么?我事先知道,某些字段总是有一个非“否”的值。如果不是这样,我可能会给自己写一个警告,提醒自己注意这一行:“警告:空行”。太棒了,正是我需要的!非常感谢!
NR == 1 {
for (i = 1; i <= NF; i++) {
title[i] = $i
}
next
}
{
for (i = 1; i <= NF; i++) {
if ($i != "no") {
printf(" %s=%s", title[i], $i)
}
}
printf("\n")
}
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:\>