Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
Tardis07
V2EX  ›  Linux

Linux Shell 如何分类统计标准输出结果

  •  
  •   Tardis07 ·
    Tardis07 · Jan 22, 2025 · 2795 views
    This topic created in 653 days ago, the information mentioned may be changed or developed.

    预期效果如下:

    >>> cat 1.txt                                                                                                                                                                                
    user_A
    user_B
    user_C
    user_A
    user_B
    user_A
    
    >>> cat 1.txt | some_command
    Line	| Times
    ------------------
    user_A	| 3
    user_B	| 2
    user_C	| 1
    
    

    是否存在已知的一个 Linux 工具可以实现这个功能,懒人不想造轮子。

    8 replies  •  2025-01-31 18:07:43 +08:00
    yanqiyu
    yanqiyu
    Jan 22, 2025
    1
    虽然没有这么好看,但是 uniq -c 就可以统计出现次数了,之后再按照要求重新排版应该就可以了
    GPLer
    GPLer
    Jan 22, 2025 via Android❤️1
    2
    sort + uniq + awk 组合实现

    cat 1.txt | sort | uniq -c | sort -nr | awk 'BEGIN {print "Line\t| Times"} {printf "%s\t| %d\n", $2, $1}'

    话说这种需求大模型确实秒了(
    GPLer
    GPLer
    Jan 22, 2025 via Android
    3
    unix 哲学更推荐用多个命令组合来完成某个需求,如果真的需要**一个**工具,可以考虑包装个脚本。(
    NessajCN
    NessajCN
    Jan 22, 2025
    4
    这类需求我一般直接搓个 python 脚本
    d = {}
    with open(sys.argv[1]) as fp:
    for l in fp.readlines():
    k = l.strip("\n")
    if not k in d:
    d[k]=1
    else:
    d[k]+=1
    print("Line\t| Times")
    print("-------------")
    for c,t in d.items():
    print(f"{c}\t| {t}")
    Tardis07
    Tardis07
    OP
    Jan 22, 2025
    5
    @yanqiyu 非常感谢,其实外观倒是无所谓,你的回复让我想起来之前 Linux Shell 去重的操作。目前`xxx | sort | uniq -c`就足以满足我的需求了,非常感谢。
    lazyzhang
    lazyzhang
    Jan 22, 2025
    6
    perl -lne 'BEGIN{print "Line\t|Times\n","-" x 15};$h{$_}++;END{print "$_\t| $h{$_}" for sort keys %h}' 1.txt
    ijustdo
    ijustdo
    Jan 23, 2025
    7
    (base) [ghostwwl@ghostwwl shell]$ cat 1.txt|awk '{c[$0]++}END{for (i in c) print i " | " c[i]}'|sort -n -k 2
    user_A | 3
    user_B | 2
    user_C | 1
    DopaminePlz
    DopaminePlz
    Jan 31, 2025 via Android
    8
    DeeoSeek 耗时 112s:
    ```
    sort 1.txt | uniq -c | awk 'BEGIN {print "Line | Times\n------------------"} {print $2 " | " $1}' | column -t -s "|" -o " | "
    ```
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   927 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 19:44 · PVG 03:44 · LAX 11:44 · JFK 14:44
    ♥ Do have faith in what you're doing.