我有两个文件:
文件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循环”。但我不知道如何存储标题字段。
答案 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