文本可以排序两次吗



我有一个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";。

我可以看到如何使用暂存文件,但在内存中执行它可能/可取吗?它是一个2 CPU Linux虚拟机上的bash shell,内存为4GB。

您的问题不清楚,也没有样本输入/输出可供测试,但这可能是您想要做的:

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
}
'

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 }'

最新更新