我正在尝试通过匹配两对不同的列来比较两个制表符分隔的文件。匹配之后,我想从水平合并的两个文件中打印匹配行(即,并排,类似于BASH粘贴)。文件有12列。
环顾四周,我没有发现任何类似的问题,这使我担心我可能对此问题的思考过多。
简而言之,目标是“将第1列(文件1)与第2列(文件2)匹配”和“第2列(文件1)与第1列(文件2)匹配”,然后分别打印匹配线并排。
一个例子:
File1.tsv
1 A ExtraInfo
2 B ExtraInfo
3 C ExtraInfo
4 D ExtraInfo
5 E ExtraInfo
File2.tsv
D 4 ExtraInfo
B 7 ExtraInfo
E 9 ExtraInfo
C 3 ExtraInfo
A 1 ExtraInfo
所需的输出:
1 A ExtraInfo A 1 ExtraInfo
3 C ExtraInfo C 3 ExtraInfo
4 D ExtraInfo D 4 ExtraInfo
尽管找不到相同问题的人,但我确实找到了一些类似的问题,使我认为awk可能是我最好的选择。不幸的是,我仍然对它一无所知,因此我的尝试仅限于尝试使代码适应类似问题。
我尝试了以下操作,但无济于事:
awk 'NR==FNR{a[$2]=$1 && a[$1]=$2;next} {print $0,a[$0]}' file1 file2
但是,如果有人只能用另一种默认语言为Ubuntu提供帮助,我仍然会很感激。
注意:OP提供了更多详细信息(例如,文件有12列)之后,我在答案中添加了@karafka的建议编辑。
假设:
一种awk/sort
解决方案:
awk -F"\t" ' # input delimiter is a tab
BEGIN { OFS=FS } # output delimiter is also a tab
NR==FNR { a[$1,$2]=$0 ; next } # store first file line in array using fields 1 & 2 as index
($2,$1) in a { print a[$2,$1],$0 } # if array entry exists with first 2 fields as index (in reverse order) then print array element==matching-line-from-file1 and $0==current-line-from-file2 to stdout
' file1.tsv file2.tsv | sort # sort output from awk [optional]
注意:删除注释以使代码混乱。
对示例数据文件运行以上操作会生成:
1 A ExtraInfo A 1 ExtraInfo
3 C ExtraInfo C 3 ExtraInfo
4 D ExtraInfo D 4 ExtraInfo
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句