1

我有两个文件:

文件 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),我想输出标题字段。示例:如果 e1>mean1+3(sd1) 为 TRUE,则打印:

基因名称1 h1

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

基因名称1 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 循环”。但我不知道如何存储标题字段。

4

1 回答 1

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
于 2013-04-15T13:28:16.397 回答