2014-09-03 77 views
0

在文本文件中,如何僅打印第一列重複但第二列不同的行?我想調和這些差異。可能使用awk/sed/bash?打印第一列匹配的行,第二列不同

輸入:

Jon AAA 
Jon BBB 
Ellen CCC 
Ellen CCC 

輸出:

Jon AAA 
Jon BBB 

注意,真正的文件沒有排序。

感謝您的任何幫助。

+0

這些條目是否總是按照您的示例分組? – 2014-09-03 22:20:13

+0

不,混合和隨機 – user1899415 2014-09-03 22:21:09

+0

在第一列中是否有超過兩行的值相同?如果是這樣,會發生什麼? – 2014-09-03 22:22:12

回答

1

這一行應該做的:(我打破了一個班輪到3線更好的閱讀)

awk '!($1 in a) {a[$1]=$2;next} 
    $1 in a && $2!=a[$1]{p[$1 FS $2];p[$1 FS a[$1]]} 
    END{for(x in p)print x}' file 
  • 一號線節省$ 1 $ 2到數組,如果它被選中第一次
  • line2:對於現有的$ 1和不同的$ 2,將它們(兩行)放入一個數組p中,以便相同的$ 1,$ 2組合不會多次打印。
  • 打印陣列p
+0

這將重新排列輸出中的順序。不知道這是否有問題。 – 2014-09-03 22:29:59

+0

不,這不會保留@TomFenech的發生順序。我們可以做到這一點,但它需要更多的檢查也需要另一個數組來保存訂單信息。 – Kent 2014-09-03 22:31:36

+0

@Kent很好的解決方案,但不清楚OP需要什麼。例如,如果你在最後引入一行'Jon AAA',它仍然會打印該行,即使該行是重複的。 – 2014-09-04 01:01:14

1
sort file | uniq -u 

的索引將僅打印唯一的行。

+0

除非你需要排序,否則你可以刪除'sort'並簡單地使用:'uniq -u file'。 – 2014-09-03 22:49:42

+0

我懷疑這是否是OP想要的。如果在他的例子中有另一行:'FOO BAR',你的uniq會將它輸出。但根據我的理解,他可能不想要那條線。 – Kent 2014-09-03 22:52:19

+0

@ DavidC.Rankin,在之前的評論中,OP表示這些行將是「混合和隨機的」,因此是種類。 – 2014-09-04 03:22:59

0

只是一個普通的獨特的排序應該工作

awk '!a[$0]++' test 
1

這可能會爲你工作:

sort file | uniq -u | rev | uniq -Df1 | rev 

此排序文件,刪除任何重複的行,反轉線,刪除和獨特的線是沒有相同的密鑰(保留第二個字段相同的重複項),並將該行反轉到其原始位置。

這將刪除單重鍵的重複行和行。

相關問題