2016-06-11 48 views
0

也許有人可以幫我解決以下問題。刪除重複項(兩行)和複製只基於一個子字符串

我使用:

cat file1 file2 | sort -t} -k2 | less 

輸出包含重複從位置5線

A01} value1 = 5000000000 
B01} value1 = 5000000000 
A01} value2 = 6000000000 
B01} value2 = 7000000000 

當比較起始如何刪除這些兩條線:從

A01} value1 = 5000000000 
B01} value1 = 5000000000 

完全我的輸出?

結果應該是:

A01} value2 = 6000000000 
B01} value2 = 7000000000 
+0

要明確,您希望獨特的值=? –

回答

2

我認爲要排序使用領域從鍵2(值)/ uniq的到鍵4(數量)。因此,當調用uniq時,字段1被跳過:

cat file1 file2 |sort -k 2,4 |uniq --skip-fields=1 --unique 
+0

不知道'--skip-fields',這個答案比我下面給出的答案要好。我唯一擔心的是*如果*這是一個僅限於GNU的功能? – andlrc

+0

是的,這是一個GNU /非posix功能。我認爲提問者使用的是GNU系統,因爲他使用了'bash'標籤 –

0

像這樣的事情可能會爲你工作:

% grep -vFf <(cut -d'}' -f2 file.txt | sort | uniq -d) file.txt 
A01} value2 = 6000000000 
B01} value2 = 7000000000 

這將創建一個包含所有非唯一行 「文件」:

cut -d'}' -f2 file.txt | sort | uniq -d 

<(...)是一個過程替換,其工作原理如下:

% echo <(ls) 
/proc/self/fd/11 

的grep -F意味着純文本搜索,並-f願與關鍵字來搜索文件名。 -v反轉比賽。

而對於乘文件,你需要-h對比賽抑制名:

grep -hvFf <(cut -d'}' -f2 a.txt b.txt | sort | uniq -d) a.txt b.txt 
+0

我認爲他們正在兩個文件(文件1中的A值,文件2中的B值)之間搜索,在這種情況下,您可能需要放置'... file1.txt file2.txt'。 –

+0

殺了它的男人。有趣的使用grep! –

+0

可能只是簡單地添加$(cat file1 file2)inplace file.txt並且將其稱爲一天 - 嘗試使用反引號,但由於某些原因,此網站反感反引號。大聲笑 –