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

标签 awk

我正在尝试使用awk找到所有$3 file2 中的值介于 $2 之间和$3file1 。如果 $3 中的值的file2介于 file1 之间字段,然后它与 $6 一起打印值 file1 。两者file1file2tab-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

文件2

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

最佳答案

您的文件包含 control-Ms,因此 print $0 将换行到下一行。首先在它们上运行 dos2unix 或类似的命令,然后如果您不想打印 id,则不要在打印语句中包含 , id

关于awk 使用另一个文件中的特定字段查找值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41148775/

相关文章:

arrays - 将单个字符串向上移动到上一行

linux - grep : print value when grep returns nothing 之后的 awk

regex - 根据模式匹配分离数值

linux - 多个执行命令以查找并在同一行中提供输出

regex - AWK 子函数语法

awk - 将每一行向下移动到第二行

linux - 如何使用 awk 修改基于第一列的列?

unix - 在模式后提取字符串

linux - awk - 括号检查

linux - awk 不分配字符串或子字符串