首页 > 解决方案 > 我们是否有一个 awk / bash 脚本来逐行比较一个文件的元素与另一个具有多个分隔符的文件?

问题描述

我有一个制表符分隔的文件(比如 file1 有 4 列),其中包含以下方式的条目。

chr1    12145   12310   ref|DDX11L1,ref|NR_046018,ens|ENST00000518655,ens|ENST00000450305,ens|ENST00000456328,ens|ENST00000515242

我有另一个文件(比如 file2),其中包含恰好是 file1 第 4 列的子部分的元素

例如。DDX11L1

有没有办法比较 file2 和 file1 的条目,如果有部分匹配,就像上面提到的情况一样,产生类似于这个的输出 -

chr1 12145  12310 DDX11L1

标签: unixawk

解决方案


这将稍微调整空格,但也许:

$ cat file1
chr1 12145 12310 ref|DDX11L1,ref|NR_046018,ens|ENST00000518655,ens|ENST00000450305,ens|ENST00000456328,ens|ENST00000515242
chr2 12345 12310 ref|DDX12L1,ref|NR_046018,ens|ENST00000518655,ens|ENST00000450305,ens|ENST00000456328,ens|ENST00000515242
$ cat file2
DDX11L1
$ awk 'NR==FNR{split($4, a, "|"); $4=""; 
    for( i in a) b[a[i]] = $0; next} 
    { for( i in b ) if( match(i, $0)) {
          print b[i], $0; next}
}' file1 file2
chr1 12145 12310  DDX11L1

请注意,这会显式拆分第 4 列|,因此不会部分匹配类似 的字符串1L1,ref|NR_,但我怀疑这是所需的行为。


推荐阅读