我想從具有3列刪除重複的基於條件AWK/bash的
A 0 3238
B 0 3367
C 0 3130
D 1 3130
我需要刪除包含在第三列中重複的值線的數據集刪除重複,但優先地保持那些有第二列中的值爲'1'。我知道如何使用awk刪除重複項,但我無法解決如何添加條件聲明。
感謝
我想從具有3列刪除重複的基於條件AWK/bash的
A 0 3238
B 0 3367
C 0 3130
D 1 3130
我需要刪除包含在第三列中重複的值線的數據集刪除重複,但優先地保持那些有第二列中的值爲'1'。我知道如何使用awk刪除重複項,但我無法解決如何添加條件聲明。
感謝
給這條線一試:
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
$ sort -k2nr file | awk '!seen[$3]++'
D 1 3130
A 0 3238
B 0 3367
'awk'的有趣位。你能解釋一下'![$ 3] ++'部分嗎? – iamauser
這是常見的awk慣用法,只輸出一系列潛在重複中的第一個值。每次在數組中使用一個值作爲索引時,該值的數組入口都是後遞增的,所以當第一次看到一個值時,它的數組入口爲零,所以'!'操作符會使整體結果爲真。在第一次之後,儘管數組條目不爲零,所以'!'使得結果爲假。這就像'uniq',但不需要對值進行排序,讓我們在字段而不是整個輸入行/記錄上進行操作。 –
謝謝,這似乎工作! – tclarke
@tclarke請接受答案。 – user1502952
+1以整潔的方式解決它。在'='wish之前,我並沒有意識到'$ 2 == 1?$ 0:a [$ 3]'是有點混亂的。我想'a [$ 3] =($ 2 == 1?$ 0:a [$ 3])'也可以。 – Qben