2014-10-01 41 views
0

我正在尋找類似this的東西,但不是計算重複行數,而是計算重複行數。Linux命令或腳本計算文本文件中重複的一堆行?

爲了清楚起見,我有一個這樣的文件:

Separator 
line11 
line12 
line13 
Separator 
line21 
line22 
line23 
Separator 
line11 
line12 
line13 
Separator 
line11 
line12 
line13 
Separator 
line31 
line32 
line33 
Separator 
line21 
line22 
line23 

而且如下

3: Separator 
     line11 
     line12 
     line13 
2: Separator 
     line21 
     line22 
     line23 
1: Separator 
     line31 
     line32 
     line33 

我excpect輸出其中:3:2:1:裝置每串行出現在文件中的次數。

我嘗試沒有成功以下命令:

sort all_lits.txt | uniq -c 

,目前我爲了獲得信息,但沒有明確的書面尚未一個awk命令。只要我得到一些命令來表明我將發佈它。

是否可以使用某些UNIX工具組合(如awk,grep,wc,sort)來獲取此信息。等。?

我知道我可以寫一個腳本來做,但我想避免這樣做。在極端的情況下,我會做。

任何幫助將被高度讚賞。

+0

嘗試提供什麼3:,2 :, 1些解釋:平均值,再加上你的企圖。如果你沒有盡力解決你的問題,不要指望別人打開其他問題和答案。 – fedorqui 2014-10-01 10:03:30

+1

最後,我使用一個Python腳本使用字典解決了這個問題,並且每次獲得匹配時都增加一個計數器。感謝@fedorqui激勵我展示自己的所作所爲。最佳 - – pafede2 2014-10-01 10:21:08

+0

不錯!你可以在答案中分享腳本,以便下一個有類似問題的人可以使用它。 – fedorqui 2014-10-01 10:25:00

回答

2
awk -v RS=Separator ' 
    NR>1 {count[$0]++} 
    END {for (bunch in count) print count[bunch], RS, bunch} 
' file 
1 Separator 
line31 
line32 
line33 

2 Separator 
line21 
line22 
line23 

3 Separator 
line11 
line12 
line13 

沒有內在的順序來輸出。如果您想通過計數遞減排序,你使用GNU AWK:

awk -v RS=Separator ' 
    NR>1 {count[$0]++} 
    END { 
     PROCINFO["sorted_in"] = "@val_num_desc" 
     for (bunch in count) print count[bunch], RS, bunch 
    } 
' file 
+0

即使我寫了我自己的腳本,我也使用@glenn jackman awk命令。兩者都很好。實際上,我用它來驗證我的腳本的功能。謝謝! – pafede2 2014-10-01 11:33:32

+0

nit-pick - 以這種方式測試$ 0將刪除任何只包含數值爲零的字符串的塊。你需要測試'NF'或'$ 0!=「」'或'/^[[:space:]] * $ /'或類似的來跳過空白記錄,但我想你可能只是想測試'NR> 1'在這種情況下跳過第一個分隔符之前的空記錄。 +1雖然。 – 2014-10-01 13:16:28

+1

謝謝@Ed,完全正確。 – 2014-10-01 13:49:36

1

這是我正在使用的腳本。它仍然是在測試時間,但它也可以用作其他人的基礎:

with open(file_name, mode="r") as bigfile: 
reader = bigfile.read() 

d = dict() 
for res in reader.split('Separator'): 
    if res in d: 
    d[res]= d[res]+1 
    else: 
    d[res]=1 

for k in d: 
    print str(k) + ':' + str(d[k])