2016-01-19 25 views
1

我有一個文件包含3列如下的字符串。提取行具有相同的第二列,但不同的第三列

a b x 
a b y 
a b z 
a c x 
a d y 

我想提取具有相同的第二列但不同的第三列的所有行。我期待在上面的例子中的輸出是

a b x 
a b y 
a b z 

我試圖uniq的-f2和排序-u -k2,但它不工作,我期望的那樣。任何建議請。

回答

1

awk來救援!

Need to make sure all records are unique first 

$ sort file | uniq | 
    awk '{c[$2]++; a[$2]=a[$2]?a[$2]RS$0:$0} 
    END{for(k in a) if(c[k]>1) print a[k]}' 

a b x 
a b y 
a b z 

說明:保持第二場出現在櫃檯聚集的記錄。最後打印計數器大於1的記錄。

+0

如果$ 2包含一個值爲零(或爲空)的值,則會失敗。您需要測試''2,而不是'a [$ 2]'。由於三元表達式不完善,您在某些awk中也可能會出現語法錯誤。最後 - 只需使用'sort -u'而不是'sort | uniq'。 –

2
awk ' 
    seen[$2]++ { 
     if (!seen[$2,$3]++) { 
      printf "%s%s\n", first[$2], $0 
     } 
     delete first[$2] 
     next 
    } 
    { first[$2] = $0 ORS } 
' file 
a b x 
a b y 
a b z 

注意的是,以上在任何AWK工作,在您的輸入文件中的任何值,不保留全部在內存中輸入文件的,不依賴於前/後處理任何外部工具,並將按照輸入行中出現的順序產生輸出行。

+0

嗨@EdMorton你能解釋一下你在腳本中做了什麼。它不適用於下面的幾個例子'c'74 _-_'75 '74 -'75 b'74 _-_'75 '74 -'75 a'74 _-_'75'74 -'75' Even @卡拉克的解決方案沒有給出預期的結果。你能否建議哪裏可以是錯誤。 – shalini

+0

我無法分辨您想要在評論中顯示的內容。如果您有示例輸入,腳本不會產生預期的輸出,然後編輯您的問題以顯示它,請不要嘗試在註釋中包含格式化文本(代碼,輸入,輸出)。確保你確實顯示了預期的輸出,但不僅僅是輸入。 –

相關問題