【问题标题】:Count lines and group by prefix word计算行数并按前缀词分组
【发布时间】:2017-07-17 17:28:30
【问题描述】:

我想计算文档中的行数并按前缀词对其进行分组。前缀是一组由第一个下划线分隔的字母数字字符。我不太关心对它们进行排序,但最好按出现次数降序列出它们。

文件如下所示:

prefix1_data1
prefix1_data2_a
differentPrefix_data3
prefix1_data2_b
differentPrefix_data5
prefix2_data4
differentPrefix_data5

输出应该如下:

prefix1           3
differentPrefix   3
prefix2           1

我已经在 python 中做到了这一点,但我很好奇是否可以使用命令行或 bash 脚本更有效地做到这一点? uniq 命令有-c-w 选项,但前缀的长度可能会有所不同。

【问题讨论】:

  • cut -d'_' -f1 <inputfile| sort |uniq -c

标签: linux bash unix command-line


【解决方案1】:

你可以使用awk:

awk -F_ '{a[$1]++}END{for(i in a) print i,a[i]}' file

字段分隔符设置为_

数组a 填充了所有第一个元素及其相关计数。

解析文件时打印数组内容

【讨论】:

    【解决方案2】:

    使用sedsortuniq命令组合的解决方案:

    sed -rn 's/^([^_]+)_.*/\1/p' testfile | sort | uniq -c
    

    输出:

    3 differentPrefix
    3 prefix1
    1 prefix2
    

    ^([^_]+)_ - 匹配从字符串开头到第一次出现下划线_ 的子字符串(前缀,包含除_ 之外的任何字符)

    【讨论】:

    • 您可以使用较短的表达式来匹配前缀:^([^_]+).*
    【解决方案3】:

    我喜欢 RomanPerekhrest 的回答。它更简洁。这是一个小改动,通过使用 cut 代替 sed 使其更加简洁。

    cut -d_ -f1 testfile | sort | uniq -c
    

    【讨论】:

      【解决方案4】:

      可以通过以下方式完成,testfile就是上面提到的内容的文件。

      printf %-20s%d"\n" prefix1 $(cat testfile|grep "^prefix1" | wc -l)
      printf %-20s%d"\n" differentPrefix $(cat testfile|grep "^differentPrefix" | wc -l)
      printf %-20s%d"\n" prefix2 $(cat testfile|grep "^prefix2" | wc -l)
      

      所以你可以用你的代码检查这个并检查哪个更有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-27
        • 2012-12-31
        • 1970-01-01
        相关资源
        最近更新 更多