文本可以排序两次吗?
Can text be sorted twice?
我有一个 awk 数组,可以聚合和下载字节。我可以按字节向下或向上对输出进行排序,然后通过管道将其传送到最活跃的用户;是否可以使用不同的键输出两种类型?
zgrep ^1 20211014T00*.gz|awk '{print,,,$(NF-7)}'| awk 'NR>1{bytesDown[ " " ]+=;bytesUp[ " " ]+=} END {for(i in bytesDown) print bytesDown[i], bytesUp[i], i}'|sort -rn|head
我希望能够再次将数组输出到“sort -rnk2|head”,而不是再次解析源代码以获得热门上传。
我知道如何使用临时文件来完成它,但是 possible/desirable 是在内存中完成吗?它是一个 bash shell,在 2 CPU Linux VM 上,具有 4GB 内存。
Bash 允许您使用 process substitutions. 做到这一点 目前尚不清楚您希望它对数据做什么;将两个结果打印到标准输出不太可能有用,所以我将每个结果发送到一个单独的文件以供以后检查。
zgrep ^1 20211014T00*.gz |
awk '{print,,,$(NF-7)}' |
awk 'NR>1{bytesDown[ " " ]+=;bytesUp[ " " ]+=}
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[ " " ]+=;bytesUp[ " " ]+=$(NF-7)}
END { for(i in bytesDown) print bytesDown[i], bytesUp[i], i }'
您的问题不明确,也没有样本 input/output 可用于测试,但这可能就是您想要做的:
zgrep '^1' 20211014T00*.gz|
awk '
NR > 1 {
key = " "
bytesdown[key] +=
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 = " "
bytesdown[key] +=
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
}
'
我有一个 awk 数组,可以聚合和下载字节。我可以按字节向下或向上对输出进行排序,然后通过管道将其传送到最活跃的用户;是否可以使用不同的键输出两种类型?
zgrep ^1 20211014T00*.gz|awk '{print,,,$(NF-7)}'| awk 'NR>1{bytesDown[ " " ]+=;bytesUp[ " " ]+=} END {for(i in bytesDown) print bytesDown[i], bytesUp[i], i}'|sort -rn|head
我希望能够再次将数组输出到“sort -rnk2|head”,而不是再次解析源代码以获得热门上传。
我知道如何使用临时文件来完成它,但是 possible/desirable 是在内存中完成吗?它是一个 bash shell,在 2 CPU Linux VM 上,具有 4GB 内存。
Bash 允许您使用 process substitutions. 做到这一点 目前尚不清楚您希望它对数据做什么;将两个结果打印到标准输出不太可能有用,所以我将每个结果发送到一个单独的文件以供以后检查。
zgrep ^1 20211014T00*.gz |
awk '{print,,,$(NF-7)}' |
awk 'NR>1{bytesDown[ " " ]+=;bytesUp[ " " ]+=}
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[ " " ]+=;bytesUp[ " " ]+=$(NF-7)}
END { for(i in bytesDown) print bytesDown[i], bytesUp[i], i }'
您的问题不明确,也没有样本 input/output 可用于测试,但这可能就是您想要做的:
zgrep '^1' 20211014T00*.gz|
awk '
NR > 1 {
key = " "
bytesdown[key] +=
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 = " "
bytesdown[key] +=
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
}
'