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

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

  •  
  •   Tardis07 ·
    Tardis07 · Jan 22, 2025 · 2295 views
    This topic created in 488 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
        1
    yanqiyu  
       Jan 22, 2025
    虽然没有这么好看,但是 uniq -c 就可以统计出现次数了,之后再按照要求重新排版应该就可以了
    GPLer
        2
    GPLer  
       Jan 22, 2025 via Android   ❤️ 1
    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
        3
    GPLer  
       Jan 22, 2025 via Android
    unix 哲学更推荐用多个命令组合来完成某个需求,如果真的需要**一个**工具,可以考虑包装个脚本。(
    NessajCN
        4
    NessajCN  
       Jan 22, 2025
    这类需求我一般直接搓个 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
        5
    Tardis07  
    OP
       Jan 22, 2025
    @yanqiyu 非常感谢,其实外观倒是无所谓,你的回复让我想起来之前 Linux Shell 去重的操作。目前`xxx | sort | uniq -c`就足以满足我的需求了,非常感谢。
    lazyzhang
        6
    lazyzhang  
       Jan 22, 2025
    perl -lne 'BEGIN{print "Line\t|Times\n","-" x 15};$h{$_}++;END{print "$_\t| $h{$_}" for sort keys %h}' 1.txt
    ijustdo
        7
    ijustdo  
       Jan 23, 2025
    (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
        8
    DopaminePlz  
       Jan 31, 2025 via Android
    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   ·   Solana   ·   5825 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 02:10 · PVG 10:10 · LAX 19:10 · JFK 22:10
    ♥ Do have faith in what you're doing.