2017-02-27 80 views
3

我想要統計文檔中的行數並按前綴詞對它進行分組。前綴是由第一個下劃線分隔的一組字母數字字符。我不關心排序他們,但很高興列出他們降序出現的次數。計數行和組按前綴詞

文件看起來是這樣的:

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選項,但前綴的長度可能會有所不同。

+4

'cut -d'_'-f1

回答

3

你可以使用awk

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

字段分隔設置爲_

一個數組a被所有第一個元素及其關聯的計數填充。

當文件被解析陣列內容使用的sedsortuniq命令組合印刷

2

解決辦法:

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

輸出:

3 differentPrefix 
3 prefix1 
1 prefix2 

^([^_]+)_ - 匹配es從字符串的開始到第一次出現下劃線的子字符串(前綴,包含除_之外的任何字符)_

+0

您可以使用較短的表達式來匹配前綴:'^([^ _] +)。*' – SergA

+0

@SergA,實際上,是的。修正了這一點,謝謝 – RomanPerekhrest

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) 

所以你可以用你的代碼檢查這個,並檢查哪一個更有效。

1

我喜歡RomanPerekhrest的回答。它更簡潔。這是一個小改動,通過使用cut代替sed使其更加簡潔。

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