File 比较两个文件,如果需要,打印标题字段
我有两个文件: 文件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中没有字段完成该条件,请将其保留为空 期望输出: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
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