我正在尝试将$4
中的file2
与file1
的$ 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}}
答案 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