Unix Awk打印两个未排序文件中的匹配行

Unix Awk打印两个未排序文件中的匹配行,unix,awk,Unix,Awk,我试图比较两个文件,我需要打印两个文件中的匹配行 文件1 a;c1|a|data a;c2|a|data b;c1|b|data b;c1|b|data 文件2 a;c2|a_1|data b;c1|b_1|data a;c3|a_1|data b;c1|b_1|data a;c1|a_1|data 输出文件 a;c1|a|data a;c2|a|data b;c1|b|data b;c1|b|data a;c2|a_1|data b;

我试图比较两个文件,我需要打印两个文件中的匹配行

文件1

a;c1|a|data  
a;c2|a|data  
b;c1|b|data  
b;c1|b|data  
文件2

a;c2|a_1|data  
b;c1|b_1|data  
a;c3|a_1|data  
b;c1|b_1|data  
a;c1|a_1|data  
输出文件

a;c1|a|data  
a;c2|a|data  
b;c1|b|data  
b;c1|b|data  
a;c2|a_1|data  
b;c1|b_1|data  
b;c1|b_1|data  
a;c1|a_1|data  

您能帮助我吗?

使用
awk
解决问题需要多次通过和
gawk
排序输入选项,这里有一个
grep
备选方案

$ function f(){ grep -f <(cut -d'|' -f1 "$2") "$1"; }; f file1 file2; f file2 file1

a;c1|a|data
a;c2|a|data
b;c1|b|data
b;c1|b|data
a;c2|a_1|data
b;c1|b_1|data
b;c1|b_1|data
a;c1|a_1|data
$function f(){grep-f
第一个模式在给定的第一个文件中存储一行(仅最后一行)
第一和第三字段。
第二个模式检查是否在第一个文件中找到了第二个文件中的第一个和第三个字段,如果是,则打印这两个字段


(未测试)

定义匹配行。您尝试了什么?您是否尝试使用
join
、或
comm
、或
diff
解决此问题?您的示例输出似乎不支持“从两个文件打印匹配行”的问题定义。请使用改进的定义更新您的Q,并尝试解决您的问题。祝您好运。感谢您的回复。我希望将两个未排序的文件与第1列和第3列进行比较,并打印这两个文件的输出。我很抱歉,因为我刚刚复制了这些文件。我尝试了以下命令,但它仅打印文件1 con帐篷.awk-F“|”'NR=FNR{a[$1,$3]++;next}(a[$1,$3])'文件1文件2.如果我以相反的方式打印文件2内容。但理想情况下,我需要这两个文件。您需要根据上面的多条评论提高Q的质量。回复评论中的澄清请求不会改善您的Q。请更新您的Q,以便我们有A.您的输入的明确定义,B.从中获得所需的输出输入,C.您的代码,D.您当前的输出,E.任何错误消息。祝您好运。感谢您的回复。但我希望将两个未排序的文件与第1列和第3列进行比较,并使用awk命令打印这两个文件的输出。由于我需要比较更多记录,请使用awk命令比较未排序的文件。第3列says“data”。你确定它是键的一部分吗?上面的脚本只对第一个字段执行此操作。不需要对文件进行排序。还要注意,您有重复的记录(例如,b;c1 | b |数据)。非常感谢您的回答。可以逐行打印而不是并排打印吗?当然,我在打印语句中将逗号改为换行符。我很好奇,排序有什么不好的地方?非常感谢tomc。它工作得很好。源文件未排序且大小巨大。我正在尝试使用相同的方法找出解决方案未排序的文件,而不是复制到临时文件和排序。我明白了,对于不同的人来说,巨大是不同的,建议你先放短一点的文件
awk 'FNR==NR{a[$1,$3]=$0}FNR!=NR{if(a[$1,$3])print a[$1,$3] "\n" $0}' f1 f2