2012-01-04 94 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