文本可以排序两次吗?

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