我想计算文档中的行数并将其按前缀词分组。前缀是由第一个下划线分隔的一组字母数字字符。我不太关心它们的排序,但根据出现的次数列出它们会很好。
该文件如下所示:
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
个选项,但前缀的长度可能会有所不同。
答案 0 :(得分:4)
您可以使用awk
:
awk -F_ '{a[$1]++}END{for(i in a) print i,a[i]}' file
字段分隔符设置为_
。
数组a
将填充所有第一个元素及其关联计数。
解析文件时,打印数组内容
答案 1 :(得分:3)
使用sed
,sort
和uniq
命令组合的解决方案:
sed -rn 's/^([^_]+)_.*/\1/p' testfile | sort | uniq -c
输出:
3 differentPrefix
3 prefix1
1 prefix2
^([^_]+)_
- 匹配从字符串开头到第一次出现下划线_
的子字符串(前缀,包含除_
之外的任何字符)
答案 2 :(得分:1)
我喜欢RomanPerekhrest的回答。它更简洁。这是一个小改动,通过使用cut代替sed来使其更简洁。
cut -d_ -f1 testfile | sort | uniq -c
答案 3 :(得分:0)
可以按照以下方式完成,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)
所以你可以用你的代码检查一下,并检查哪一个更有效。