比较两个文件具有不同字段分隔符的不同列,而第二个文件具有不相等的列数

时间:2018-09-03 08:57:28

标签: awk

我想比较file1的第二列和file2的最后一列(物种名称),如果它们匹配,则打印file1的第一列和file2的所有列。但是,当DropDown用作分隔符时,这些文件包含不同的字段分隔符,并且第二个文件的列数不相等。这两个文件仅包含唯一的行。 我试图用grep和部分行匹配来解决此问题,但是awk似乎更适合于此。

文件1:

System.Boolean

文件2:

__

输出:

AF074611.1  Yersinia pestis 
AE002160.2  Chlamydia muridarum 
AE002162.1  Chlamydia muridarum 
AE003849.1  Xylella fastidiosa

我该如何实现?谢谢。

2 个答案:

答案 0 :(得分:0)

awk 'FNR==NR{a[$2]=$1;next} $5 in a {print a[$5],$0}' FS='\t' file1 FS='__' file2

在此脚本中,首先读取file1,并将其字段记录在数组a中。然后,使用不同的字段分隔符处理第二个文件。

答案 1 :(得分:0)

如果一个或两个文件中都存在重复的键值匹配,这将满足我的期望:

$ awk '
    NR==FNR  { a[$2][$1]; next }
    $NF in a { for (val in a[$NF]) print val, $0 }
' FS='\t' file1 FS='__' file2

例如:

$ cat file1
AF074611.1      Yersinia pestis
AE002160.2      Chlamydia muridarum
AE002162.1      Chlamydia muridarum
AE003849.1      Xylella fastidiosa
added_value     Yersinia pestis

$ cat file2
o__Enterobacterales;f__Yersiniaceae;g__Yersinia;s__Yersinia pestis
o__Enterobacterales;f__Yersiniaceae;g__Yersinia;s__
o__Methylococcales;f__Crenotrichaceae;g__Crenothrix;s__Crenothrix polyspora
o__Methylococcales;f__;g__;s__
o__Xanthomonadales;f__Xanthomonadaceae;g__Xylella;s__
o__Xanthomonadales;f__Xanthomonadaceae;g__Xylella;s__Xylella fastidiosa
o__Xanthomonadales;f__Xanthomonadaceae;g__Xylella;s__Xylella taiwanensis
o__added_here_too;f__Yersiniaceae;g__Yersinia;s__Yersinia pestis

$ awk 'NR==FNR{a[$2][$1];next} $NF in a{for (val in a[$NF]) print val, $0}' FS='\t' file1 FS='__' file2
AF074611.1 o__Enterobacterales;f__Yersiniaceae;g__Yersinia;s__Yersinia pestis
added_value o__Enterobacterales;f__Yersiniaceae;g__Yersinia;s__Yersinia pestis
AE003849.1 o__Xanthomonadales;f__Xanthomonadaceae;g__Xylella;s__Xylella fastidiosa
AF074611.1 o__added_here_too;f__Yersiniaceae;g__Yersinia;s__Yersinia pestis
added_value o__added_here_too;f__Yersiniaceae;g__Yersinia;s__Yersinia pestis

上面的代码将GNU awk用于真正的多维数组,如果没有gawk,可以很容易地对其进行调整以使其适用于任何awk。