Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何仅打印具有特定值的列_Shell_Awk_Gawk - Fatal编程技术网

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:\>