2012-01-04 92 views
5

我有2个nix文件。所有的数据都在每个文件的一行中。每个值由空字符分隔。有些关闭数据匹配中的值。将2个Unix文件和输出匹配行与新文件进行比较?

我该如何解析这个数据到一个只列出匹配值的新文件?

我想我可以使用sed将空字符更改为换行符?从那里开始我并不确定...

任何想法?

+4

是一个单一的文件中有重复的值?一些示例数据会有所帮助。 – 2012-01-04 04:46:08

+1

将定位有任何区别,或者你只是在文件中的任何一点寻找匹配的存在?正如@JohnZwinck所说,样本数据会有所帮助。 – Radix 2012-01-04 05:00:10

+0

定位没有区别,可能有重复的值。 – rreeves 2012-01-04 05:33:22

回答

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> 
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) 

这种做法是不可移植的,它需要猛砸的“进程替换”功能。

1

这可能会为你工作:

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