我有2个nix文件。所有的数据都在每个文件的一行中。每个值由空字符分隔。有些关闭数据匹配中的值。将2个Unix文件和输出匹配行与新文件进行比较?
我该如何解析这个数据到一个只列出匹配值的新文件?
我想我可以使用sed将空字符更改为换行符?从那里开始我并不确定...
任何想法?
我有2个nix文件。所有的数据都在每个文件的一行中。每个值由空字符分隔。有些关闭数据匹配中的值。将2个Unix文件和输出匹配行与新文件进行比较?
我该如何解析这个数据到一个只列出匹配值的新文件?
我想我可以使用sed将空字符更改为换行符?从那里开始我并不确定...
任何想法?
使用tr
,sort
和comm
:
转换零点到新的线路,并将结果进行排序:
$ 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>
如果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)
这种做法是不可移植的,它需要猛砸的“进程替换”功能。
这可能会为你工作:
parallel 'tr "\000" "\n" <{} | sort -u' ::: file{1,2} | sort | uniq -d
是一个单一的文件中有重复的值?一些示例数据会有所帮助。 – 2012-01-04 04:46:08
将定位有任何区别,或者你只是在文件中的任何一点寻找匹配的存在?正如@JohnZwinck所说,样本数据会有所帮助。 – Radix 2012-01-04 05:00:10
定位没有区别,可能有重复的值。 – rreeves 2012-01-04 05:33:22