Woj*_*h K 6 unix linux bash command-line
我想计算文档中的行数并按前缀词对其进行分组。前缀是一组由第一个下划线分隔的字母数字字符。我不太关心对它们进行排序,但最好按出现次数降序列出它们。
该文件如下所示:
prefix1_data1
prefix1_data2_a
differentPrefix_data3
prefix1_data2_b
differentPrefix_data5
prefix2_data4
differentPrefix_data5
Run Code Online (Sandbox Code Playgroud)
输出应如下所示:
prefix1 3
differentPrefix 3
prefix2 1
Run Code Online (Sandbox Code Playgroud)
我已经在 python 中做到了这一点,但我很好奇是否可以使用命令行或 bash 脚本更有效地做到这一点?uniq
命令有-c
和-w
选项,但前缀的长度可能会有所不同。
使用sed
,sort
和uniq
命令组合的解决方案:
sed -rn 's/^([^_]+)_.*/\1/p' testfile | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
输出:
3 differentPrefix
3 prefix1
1 prefix2
Run Code Online (Sandbox Code Playgroud)
^([^_]+)_
_
- 匹配从字符串开头到第一次出现下划线的子字符串(前缀,包含除 之外的任何字符)_
你可以使用awk
:
awk -F_ '{a[$1]++}END{for(i in a) print i,a[i]}' file
Run Code Online (Sandbox Code Playgroud)
字段分隔符设置为_
。
数组a
填充了所有第一个元素及其关联的计数。
解析文件时打印数组内容