比较2个Unix文件和输出匹配行到新文件?

时间:2012-01-04 04:44:01

标签: linux perl bash sed awk

我有2个nix文件。所有数据都在每个文件的一行中。每个值由空字符分隔。一些关闭数据中的值匹配。

如何将此数据解析为仅列出匹配值的新文件?

我想我可以使用sed将空字符更改为换行符吗?从那以后,我不确定......

有什么想法吗?

3 个答案:

答案 0 :(得分:12)

使用trsortcomm

将空值转换为新行,并对结果进行排序:

$ tr '\000' '\n' < file1 | sort > file1.txt
$ tr '\000' '\n' < file2 | sort > file2.txt

然后使用comm获取两个文件共有的行:

$ comm -1 -2 file1.txt file2.txt
<lines shown here are the common lines between file1.txt and file2.txt>

答案 1 :(得分:5)

如果file1或file2中没有重复值,则可以执行以下操作:

( tr '\0' '\n' < file1; tr '\0' '\n' < file2 ) | sort | uniq -c | egrep -v '^ +1'

这将计算两个文件之间的所有重复值。

如果字段的顺序很重要,您可以这样做:

comm -1 -2 <(tr '\0' '\n' < file1) <(tr '\0' '\n' < file2)

这种方法不可移植,需要Bash的“进程替换”功能。

答案 2 :(得分:1)

这可能对您有用:

parallel 'tr "\000" "\n" <{} | sort -u' ::: file{1,2} | sort | uniq -d