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