使用awk在文件之间进行部分匹配

时间:2016-03-23 18:04:24

标签: awk

我正在尝试将$4中的file2file1的$ 1中的部分字符串进行匹配,并将该文件中的内容$2放入$4 file2|分隔。我遇到的问题是file2 $4中的字符串ADH5_1中的字符串看起来像file1,而$1 426_238486_128(ADH5)_1_1中的字符串看起来像426_238486_128(ADH5)_1_1 70 426_238487_128(ADH5)_2_1 50.83 426_238488_128(ADH5)_3.1_1 46.67 。我不知道如何最好地接近这一点。谢谢你:)。

文件1

chr4    100009839   100009851   ADH5_1
chr4    100006265   100006367   ADH5_2
chr4    100003125   100003267   ADH5_3

file2的

chr4    100009839   100009851   ADH5_1|70
chr4    100006265   100006367   ADH5_2|50.83
chr4    100003125   100003267   ADH5_3|46.67

所需的输出

awk

我知道awk '$1 ~ /AGRN_1/ { print }' file1 中的部分匹配可以完成,但不知道如何在整个文件而不是关键字上执行此操作,以及如何格式化字符串以便可以正确搜索。

{{1}}

3 个答案:

答案 0 :(得分:1)

您可以使用这样的awk脚本(使用GNU Awk测试):

FNR==NR { # file 1
    # extract key from $1
    k = gensub( /^.*\(([^)]+)\)_([0-9]+).*$/, "\\1_\\2", 1, $1 )
    m[ k ] = $2 # store value $2 from file1
    next # line (of file1)
    }

    # file2
    {
    print $0 "|" m[$4]
    }

像这样使用:

awk -f script.awk file1 file2

对第一个文件执行FNR==NR后的第一个块,next注意第一个文件没有到达第二个块。此块计算密钥(以第二个文件的格式)并将值存储在密钥下。

第二个块仅对第二个文件执行,它会查找该值并打印所需的行。

答案 1 :(得分:1)

awk救援!

删除括号并查找匹配

$ awk 'NR==FNR{sub(/\(/,"");sub(/\)/,""); a[$1]=$2; next}
     {for(k in a) {if(k~$4) {print $0, a[k]; next}}}' file1 file2

chr4    100009839   100009851   ADH5_1 70
chr4    100006265   100006367   ADH5_2 50.83
chr4    100003125   100003267   ADH5_3 46.67

对于管道分隔符,请设置-v OFS='|'

答案 2 :(得分:1)

$ awk -v OFS='|' 'NR==FNR{split($1,t,/[_().]+/); a[t[4]"_"t[5]]=$NF; next} {print $0, a[$NF]}' file1 file2
chr4    100009839   100009851   ADH5_1|70
chr4    100006265   100006367   ADH5_2|50.83
chr4    100003125   100003267   ADH5_3|46.67