我有一個 awk 陣列,可以匯總和下載位元組。我可以按位元組向下或向上對輸出進行排序,然后通過管道將其發送給最重要的發言者;是否可以使用不同的鍵輸出兩種型別?
zgrep ^1 20211014T00*.gz|awk '{print$3,$11,$6,$(NF-7)}'| awk 'NR>1{bytesDown[$1 " " $2] =$3;bytesUp[$1 " " $2] =$4} END {for(i in bytesDown) print bytesDown[i], bytesUp[i], i}'|sort -rn|head
我希望能夠再次將陣列輸出到“sort -rnk2|head”,而不是再次決議源以獲取最熱門的上傳。
我可以看到我將如何使用暫存檔案進行操作,但是是否可能/希望在記憶體中進行操作?它是一個 bash shell,位于具有 4GB 記憶體的 2 CPU Linux VM 上。
uj5u.com熱心網友回復:
你的問題不清楚,沒有樣本輸入/輸出來測驗,但這可能是你想要做的:
zgrep '^1' 20211014T00*.gz|
awk '
NR > 1 {
key = $3 " " $11
bytesdown[key] = $6
bytesup[key] = $(NF-7)
}
END {
cmd = "sort -rn | head"
for ( key in bytesDown ) {
print bytesDown[key], bytesUp[key], key | cmd
}
close(cmd)
cmd = "sort -rnk2 | head"
for ( key in bytesDown ) {
print bytesDown[key], bytesUp[key], key | cmd
}
close(cmd)
}
'
可以更簡潔有效地寫成:
zgrep '^1' 20211014T00*.gz|
awk '
NR > 1 {
key = $3 " " $11
bytesdown[key] = $6
bytesup[key] = $(NF-7)
if ( NR == 2 ) {
max_bytesdown_key = key
max_bytesup_key = key
}
else {
if ( bytesdown[key] > bytesdown[max_bytesdown_key] ) {
max_bytesdown_key = key
}
if ( bytesup[key] > bytesup[max_bytesup_key] ) {
max_bytesup_key = key
}
}
}
END {
print bytesdown[max_bytesdown_key], bytesup[max_bytesdown_key], max_bytesdown_key
print bytesdown[max_bytesup_key], bytesup[max_bytesup_key], max_bytesup_key
}
'
uj5u.com熱心網友回復:
Bash 允許您通過行程替換來做到這一點。不清楚您希望它對資料做什么;將兩個結果列印到標準輸出不太可能有用,所以我將每個結果發送到一個單獨的檔案以供以后檢查。
zgrep ^1 20211014T00*.gz |
awk '{print$3,$11,$6,$(NF-7)}' |
awk 'NR>1{bytesDown[$1 " " $2] =$3;bytesUp[$1 " " $2] =$4}
END {for(i in bytesDown) print bytesDown[i], bytesUp[i], i}' |
tee >(sort -rn | head >first) |
sort -rnk2 | head >second
雙 awk 可以很容易地重構為單個 awk 腳本。像這樣的東西?
awk 'NR>1{bytesDown[$3 " " $11] =$6;bytesUp[$3 " " $11] =$(NF-7)}
END { for(i in bytesDown) print bytesDown[i], bytesUp[i], i }'
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/369245.html
