File 比较两个文件,如果需要,打印标题字段

File 比较两个文件,如果需要,打印标题字段,file,header,awk,compare,File,Header,Awk,Compare,我有两个文件: 文件1(第一行是标题) 文件2(无标题) 如果File1中的字段e1、e2、e3…中的任何一个对于相应的gene_名称是File2中的>mean1+3(sd1),我想输出头字段。示例:如果e1>mean1+3(sd1)为真,则打印: 基因名称1 h1 如果e2>mean1+3(sd1)为真,则将h2添加到行中: 基因名称1 h1 h2 如果$1与两个文件都匹配,则对每一行执行此操作。如果File1中没有字段完成该条件,请将其保留为空 期望输出: gene_name1 h1 h2

我有两个文件:

文件1(第一行是标题)

文件2(无标题)

如果File1中的字段e1、e2、e3…中的任何一个对于相应的gene_名称是File2中的>mean1+3(sd1),我想输出头字段。示例:如果e1>mean1+3(sd1)为真,则打印:

基因名称1 h1

如果e2>mean1+3(sd1)为真,则将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;下一个}$1。。。然后为文件1中的每个字段创建一个“for循环”。但是我不知道如何存储标题字段。

这应该可以做到:

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 ""
}

这应该可以做到:

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 ""
}

你的描述对我来说不是100%清楚,我已经为我相信你的意思添加了一个答案。如果这是错误的,请使用我给定输入的预期输出更新问题。发布具有代表性的输入和带有问题类型的预期输出总是很有帮助的。很抱歉,我没有这么清楚,我更新了问题。请参见编辑,现在就应该这样做。它成功了!非常感谢sudo_O!你的描述对我来说不是100%清楚,我已经为我相信你的意思添加了一个答案。如果这是错误的,请使用我给定输入的预期输出更新问题。发布具有代表性的输入和带有问题类型的预期输出总是很有帮助的。很抱歉,我没有这么清楚,我更新了问题。请参见编辑,现在就应该这样做。它成功了!非常感谢sudo_O!
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