awk使用另一个文件中的特定字段查找值

时间:2016-12-14 17:36:30

标签: awk

我正在尝试使用awk查找$3file2$2之间$3file1之间的所有$3值。如果file2的{​​{1}}中的值介于file1字段之间,那么它将与$6中的file1值一起打印。 file1file2都是tab-delimited以及所需的输出。如果没有要打印的内容,则处理下一行。下面的awk已关闭,但使用我的实际~30MB文件,它处理速度慢,并以意外格式打印。我不知道如何调整。谢谢你:)。

文件1

chr1    948953  948956  chr1:948953-948956  .   ISG15
chr1    949363  949858  chr1:949363-949858  .   ISG15
chr1    955542  955763  chr1:955542-955763  .   AGRN
chr1    957570  957852  chr1:957570-957852  .   AGRN
chr1    976034  976270  chr1:976034-976270  .   AGRN

file2的

rs13303106  1   891945  GG
rs28415373  1   893981  CC
rs13303010  1   894573  AA
rs6696281   1   903104  CC
rs28391282  1   904165  GG
rs6657048   1   957640  CC
rs2710888   1   959842  CT
rs3128126   1   962210  AG
rs2710875   1   977780  CT
rs4511111   1   949375  GG

当前输出

rs6657048   1   957640  CC  
4   AGRN
rs4511111   1   949375  GG  
2   ISG15

所需的输出

rs6657048   1   957640  CC  AGRN
rs4511111   1   949375  GG  ISG15

AWK

awk -F'\t' -v OFS='\t' '                   
NR == FNR {min[NR]=$2; max[NR]=$3; Gene[NR]=$NF; next}
{                
    for (id in min) 
        if (min[id] < $3 && $3 < max[id]) {
            print $0, id, Gene[id]
            break              
        }
}                                     
' file1 file2

1 个答案:

答案 0 :(得分:2)

您的文件包含control-Ms,因此print $0将包含在下一行中。首先运行dos2unix或类似内容,如果您不想打印, id,则不要在打印声明中包含id