awk - 比较具有不同字段分隔符的两个文件的不同列,而第二个文件的列数不相等
问题描述
我想将 file1 的第二列与 file2 的最后一列(物种名称)进行比较,如果它们匹配,则打印 file1 的第一列和 file2 的所有列。但是,这些文件包含不同的字段分隔符,并且第二个文件在__
用作分隔符时具有不相等的列数。这两个文件都只包含唯一的行。我试图用 grep 和部分行匹配来解决这个问题,但是 awk 似乎更适合这个问题。
文件1:
AF074611.1 Yersinia pestis
AE002160.2 Chlamydia muridarum
AE002162.1 Chlamydia muridarum
AE003849.1 Xylella fastidiosa
文件2:
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
输出:
AF074611.1 o__Enterobacterales;f__Yersiniaceae;g__Yersinia;s__Yersinia pestis
AE003849.1 o__Xanthomonadales;f__Xanthomonadaceae;g__Xylella;s__Xylella fastidiosa
我怎么能做到这一点?谢谢。
解决方案
awk 'FNR==NR{a[$2]=$1;next} $5 in a {print a[$5],$0}' FS='\t' file1 FS='__' file2
在此脚本中,file1
首先读取它的字段,并将其字段记录在一个数组中a
。然后使用不同的字段分隔符处理第二个文件。
推荐阅读
- angular - 当我试图用语法纠正我的拼写时,在拼写错误后删除句子
- html - 如何在 Angular 中向 ngbDropdownMenu 添加验证?
- mongodb - 具有多个分组依据的 MongoDB 聚合查询
- c++ - OpenCV 减速
- swift - Xcode 12 和 OSLog (os.log):包装 OSLogMessage 会导致编译错误:参数必须是字符串插值
- laravel - 在 Laravel 或 nginx 中删除或更改一个特定文件的 X-Frame-Options
- html - Bootstrap 4 使用引导程序根据设备大小对元素的位置应用响应
- java - 使用 Java 在 FTP 服务器中解压缩文件
- c# - 为什么 app.config 和 packages.config 中添加 Nuget 的程序集版本不匹配?
- java - 如何在运行时提供 MapStruct Mapping 注解映射元数据