比较两个文件,打印标题字段if

时间:2013-04-15 13:07:26

标签: file header awk compare

我有两个文件:

文件1(第一行是标题)

gene h1 h2 h3 h4 h5 h6 h7 h8...
gene_name1 e1 e2 e3 e4 e5 e6 e7 e8...
gene_name2 ...
gene_name3 ...
...

文件2(无标题)

gene_name1 mean1 mean2 sd1 sd2
gene_name2 ...
gene_name3 ... 

如果File1中的任何字段e1,e2,e3 ...是>我想输出标题字段。来自File2的mean1 + 3(sd1)对应的gene_name。示例:如果e1> mean1 + 3(sd1)为TRUE,则打印:

gene_name1 h1

如果e2> mean1 + 3(sd1)为TRUE,则将h2添加到该行:

gene_name1 h1 h2

如果$ 1与两个文件匹配,则为每一行执行此操作。如果File1中没有完成条件的字段,请将其留空。

期望的输出:

gene_name1 h1 h2
gene_name2 
gene_name3 h5 h6 h8
gene_name4 h1 h5
gene_name5 h3
gene_name6 
gene_name7 h2 h5 h7 h8
...

我在思考像:

awk 'FNR==NR{a[$1]=$2+3*$4;next} $1 in a ...然后为文件1中的每个字段添加一个“for循环”。但我不知道如何存储标题字段。

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

FNR==NR {
    a[$1]=$2+3*$4
    next
}
FNR==1 {
    split($0,h,/ /)
    next
}
($1 in a){

    printf "%s ",$1

    for (i=2;i<=NF;i++) {
        if ($i > a[$1]) {
            printf "%s ",h[i] 
        }
    }
    print ""
}

演示:

$ cat file1 
gene h1 h2 h3 
gene1 1.0 2.0 3.0
gene2 0.5 0.5 0.5
gene3 100 50 10

$ cat file2
gene1 1.0 2.0 0.10 0.20
gene2 2.4 2.6 0.24 0.45
gene3 1.4 5.3 1.33 0.32

$ awk -f script.awk file2 file1
gene1 h2 h3 
gene2 
gene3 h1 h2 h3