2013-08-26 39 views
0

我想從具有3列刪除重複的基於條件AWK/bash的

A  0 3238 
B  0 3367 
C  0 3130 
D  1 3130 

我需要刪除包含在第三列中重複的值線的數據集刪除重複,但優先地保持那些有第二列中的值爲'1'。我知道如何使用awk刪除重複項,但我無法解決如何添加條件聲明。

感謝

回答

3

給這條線一試:

awk '{if($3 in a)a[$3]=$2==1?$0:a[$3];else a[$3]=$0}END{for(i in a)print a[i]}' file 
+0

謝謝,這似乎工作! – tclarke

+0

@tclarke請接受答案。 – user1502952

+0

+1以整潔的方式解決它。在'='wish之前,我並沒有意識到'$ 2 == 1?$ 0:a [$ 3]'是有點混亂的。我想'a [$ 3] =($ 2 == 1?$ 0:a [$ 3])'也可以。 – Qben

3
$ sort -k2nr file | awk '!seen[$3]++' 
D  1 3130 
A  0 3238 
B  0 3367 
+1

'awk'的有趣位。你能解釋一下'![$ 3] ++'部分嗎? – iamauser

+1

這是常見的awk慣用法,只輸出一系列潛在重複中的第一個值。每次在數組中使用一個值作爲索引時,該值的數組入口都是後遞增的,所以當第一次看到一個值時,它的數組入口爲零,所以'!'操作符會使整體結果爲真。在第一次之後,儘管數組條目不爲零,所以'!'使得結果爲假。這就像'uniq',但不需要對值進行排序,讓我們在字段而不是整個輸入行/記錄上進行操作。 –