2015-06-12 21 views

回答

4

awk似乎是這項任務的主要候選人。簡單地遍歷輸入文件,並保留一個由第一列值索引的數組,如果它大於當前存儲的值,則存儲第二列的值。在遍歷迭代陣列上的端部以打印索引和相應的值

awk '{ 
    if (a[$1] < $2) { 
     a[$1]=$2 
    } 
} END { 
    for (i in a) { 
     print i, a[i] 
    } 
}' ifile.dat 

現在的結果將不會被數字上的第一列進行排序,但如果所需

+2

請注意,最大值爲負數的第一組將失敗。在測試當前值是否更大之前,您應該查看是否設置了[a [$ 1]]。在if(a [$ 1] <$ 2)之前加'if(a [$ 1] ==「」)a [$ 1] = $ 2;''。 –

+0

是喬納森,你說得對。 – Kay

1

時應該容易地固定做最小/最大運算,總是使用讀出的第一值種子最小/最大變量:

$ cat tst.awk 
!($1 in max) || $2>max[$1] { max[$1] = $2 } 
END { 
    PROCINFO["sorted_in"] = "@ind_num_asc" 
    for (key in max) { 
     print key, max[key] 
    } 
} 

$ awk -f tst.awk file 
1 40 
2 20 
3 34 
4 50 
5 3 

上面使用了GNU AWK 4. *爲PROCINFO["sorted_in"]控制輸出順序,見http://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal

1

另一種方法是使用排序。 列2上的第一個數字排序遞減,然後刪除列1的非唯一值,一行:

sort -n -r -k 2 ifile.dat | sort -u -n -k 1

0

考慮到你的第一個字段將從1開始,如果是,那麼在awk中再嘗試一個更多的解決方案。

awk '{a[$1]=$2>a[$1]?$2:(a[$2]?a[$2]:$2);} END{for(j=1;j<=length(a);j++){if(a[j]){print j,a[j]}}}' Input_file 

在這裏也增加一個相同的方法。

sort -k1 Input_file | awk 'prev != $1 && prev{print prev, val;val=prev=""} {val=val>$2?val:$2;prev=$1} END{print prev,val}' 
0

找到第二列的最大值最簡單的命令是這樣的

排序-nrk2的data.txt | awk'NR == 1 {print $ 2}'