2015-03-25 32 views
1

想象一下,您希望在表格的給定字段中保留具有最高值的記錄,只需在由另一個字段定義的類別內進行比較(並忽略其他內容)。awk:保留共享一個字段的最高值的記錄,同時忽略其他字段

因此,考慮到輸入nye.txt:

X A 10.00 
X A 1.50 
X B 0.01 
X B 4.00 
Y C 1.00 
Y C 2.43 

你會想到這樣的輸出:

X A 10.00 
Y C 2.43 

這是此以前,相關話題的offshot:awk: keep records with the highest value, comparing those that share other fields

我已經有了一個解決方案(見下文),但歡迎提供想法!

回答

4

像這樣與AWK

awk '$3>=a[$1]{a[$1]=$3; b[$1]=$0} END{for(i in a)print b[i]}' File 

對於每個1st column value(X,Y等),如果3rd column value大於或等於先前所存儲的極大值(即a[$i];最初默認情況下將爲0),請使用此3rd column value更新[$ i]。同時保存數組b中的整行。在END塊內,打印結果。

輸出:

AMD$ awk '$3>a[$1]{a[$1]=$3; b[$1]=$0} END{for(i in a)print b[i]}' File 
X A 10.00 
Y C 2.43 
+2

這似乎是自然的方式。由於問題標記爲「gawk」,請讓我留下一個[link](https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html),其中詳細說明了如何輕鬆控制用GNU awk輸出。可能是相關的。 – Wintermute 2015-03-25 10:48:51

+0

你更簡單,更好,謝謝!我利用「拆分字符串」功能來保留未使用的字段,如果您定義了兩個數組,則這不是必需的。 – XGrau 2015-03-25 11:14:51

0

我的解決辦法是:

awk '{ k=$1 } { split(a[k],b," ") } $3>b[2] { a[k]=$2" "$3 } END { for (i in a) print i,a[i] }' nye.txt 

第一支架塊指示哪個字段定義在其內要比較的其他字段的類別(第一和第三字段,在這種情況下)。

(基於https://stackoverflow.com/a/29239235/3298298

想法表示歡迎!

相關問題