2016-06-24 23 views
0

我的數據是這樣的:如何使用awk選擇最大值基於一列和第二列分組的行?

1 161 a 
1 48 b 
1 30 c 
2 199 d 
2 1306 d 
2 1290 d 
2 81 d 
2 51 e 
2 82 e 
2 93 e 
3 64 e 
3 99 f 
3 123 f 

在三個列中的每個值,我想列有在列2和組最大值選擇第1行 因此所需的輸出是

1 161 a 
1 48 b 
1 30 c 
2 1306 d 
2 93 e 
3 64 e 
3 123 f 

分組一列我的意思是我想在第1列的所有不同值的結果是什麼我嘗試使用是

awk '$2>max[$3]{max[$3]=$2; row[$3]=$0} END{for (i in row) print row[i]}' file 

我得到以下結果

1 161 a 
1 48 b 
1 30 c 
2 1306 d 
2 93 e 
3 123 f 

但我缺少以下行的結果

3 64 e 

這是因爲這一個內襯2欄第3列中選擇了不同的值只是最大值,如何按列1對此進行分組以獲得第1列中每個值的所需結果?

+1

嘗試sort -r -n -k2 <文件| awk'\!x [$ 1,$ 3] ++'| sort -k1 –

+0

@soFan:我喜歡這個想法,但是從你的命令'sort -r -n -k2 Inian

+0

@inian,請隨意做。 –

回答

1

sofan's想法了在評論中,有一些額外的操作爲OP希望下面的邏輯會做的伎倆。

sort -r -n -k2 < file| awk '!x[$1 FS $3]++' | sort -k1 
  • 思想是按升序排列的第一(sort -n -k2)的文件進行排序,並在第2列扭轉它(-r)(其現在將降序)
  • awk '!x[$1 FS $3]++確實該內容唯一的分組通過柱1和3和sort -k1種類/組它通過柱1項內容
+0

謝謝你解釋這個想法。有用。 –

4

我想你可以使用的$1$3複合鍵:

awk '$2 > max[$1$3] { max[$1$3]=$2; 
         row[$1$3]=$0 } 
       END { for (i in row) print row[i] }' file 
+0

正如OP所需!儘管有一個最基本的問題,但我發現人們使用像'max [$ 1 $ 3]這樣的變量,就像你的答案一樣。這是如何評估的第一次?是否所有這樣的變量都會以'0開始? – Inian

+1

@Inian我決不會接受AWK,但對於我最好的猜測'max [「not existing」]'將評估爲一個空字符串,其數值比較爲0. – andlrc

+0

這也適用,謝謝您!! –

0

找到在第二列中的最大和最小值,最簡單的命令是這樣的分別

sort -nrk2 data.txt | awk'NR == 1 {print $ 2}' sort -nk2 data.txt | awk'NR == 1 {print $ 2}'

0

您可以在沒有awk的情況下執行此操作。我必須使用tr -s " "來禁止字段/列之間的多個空格分隔符。下面重要的一行是第二行。

cat $file | tr -s " " \ 
| sort -k2nr,2 | sort -k1,1 -k3,3 -u | sort -k3,3 -k1,1 -k2nr,2 \ 
| tr " " "\t" 

實際上,最後的-k2nr,2甚至沒有必要。您可以保留使用--stable代替的初始排序順序。條條大路通羅馬。

相關問題