我想比较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
我该如何实现?谢谢。
答案 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。