我正在嘗試列印所有最大值
所以,如果文字看起來像
'''
name1 job1 9500.
name2 job2 9500.
name3 job3 4500.
'''
我想像這樣列印
'''
job: job1, sal: 9500
job: job2, sal: 9500
''''
到目前為止,我的代碼是
'''
BEGIN {a=0}
{if ($3> a)
max=$3;
output=$2
}
END{
print "job: ", output, "sal:", max}
'''
我得到的輸出是
'''
job: job2, sal: 9500
'''
uj5u.com熱心網友回復:
一種方法可能是跟蹤最大數量,如果您有一個更大的數字,則存盤該數字。
如果它與當前數字相同,則跟蹤陣列中的那些行(欄位 2 和欄位 3),并在最后列印它們。
awk '
{
if ($3 > max) {
max = $3
i = 0;
lines[ i] = $2 OFS $3
next;
}
if ($3 == max) lines[ i] = $2 OFS $3
}
END {
for (j=1;j<=i; j ) print lines[j]
}' file
輸出
job1 9500
job2 9500
uj5u.com熱心網友回復:
這是一個 awk 兩遍解決方案,因此整個檔案不需要在記憶體中:
awk 'FNR==NR{max=$3>max ? $3 : max; next}
$3==max {print $2, $3}' file file
印刷:
job1 9500
job2 9500
uj5u.com熱心網友回復:
您不需要 2-pass,也不需要將其全部預裝在記憶體中:
echo "${input}" | gsort -n | gtee >( gpaste - >&2; ) |
mawk ' _ <= (__=$3) { if ( _< __) {
split("",___)
_ = __
____ = NR
} ___[NR] = $2 OFS __
} END {
for (_=____;_<=NR;_ ) { if (_ in ___) {
print ___[_] } } } ' | gcat -n | ecp
name1 job1 9500.
name2 job2 9500.
name3 job3 4500.
1 job1 9500.
2 job2 9500.
echo "${input}" | gsort -nr | gtee >( gpaste - >&2; ) |
gawk ' _ <= (__=$3) { if ( _< __) {
split("",___)
_ = __
} ___[NR] = $2 OFS __
} END {
PROCINFO["sorted_in"] = "@ind_num_asc"
for (_ in ___) {
print ___[_] } } ' | gcat -n | ecp
name3 job3 4500.
name2 job2 9500.
name1 job1 9500.
1 job2 9500.
2 job1 9500.
因為當你只需要與最大值匹配的那些時,只需存盤與當前最大值匹配的行,
因此,每當找到新的最大值時,所有以前存盤的行都不再符合條件,因此只需清除整個陣列 ( split("", arr)) 并重新開始,同時更新狀態變數并注意當前行號 ( NR),這樣您就不需要從1開始一直回圈
如果輸入也包含負值,則將 的初始狀態設定"_"為log(0) aka neg. infinity
mawk注意代碼和gawk版本之間的區別
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/534562.html
標籤:Linuxawk最大限度
下一篇:在處理上述例外([Errno13]Permissiondenied:'new1234567.csv')的程序中,又發生了一個例外
