2017-02-24 83 views
0

我有一個文件夾,我想要做的是寫一個shell腳本,它打印文件的名稱以及這些文件中某個單詞重複的次數。grep命令 - 文件名和每個文件中某個單詞的重複次數打印在兩列中

我的輸出應該是這個樣子:

filename 3 
filename 12 
filename 24 
… 

文件名不包括路徑和擴展名的文件的名稱即可。

我設法用一個for循環來做到這一點,但我認爲,執行時間是不是很有效,所以我的其他想法是使用grep命令:

grep -c 「word" */*.txt 

輸出我得到這個樣子的:

folder/filename.txt:3 

我試圖使用cut命令,但我無法弄清楚如何避免減少單詞出現在不同文件中的次數,並且文件名和數字之間必須有空格。

grep -c 「word" */*.txt | cut -d'/' -f2 | cut -d'.' -f1 

任何想法如何用grep或其他替代方法做到這一點?

+1

請發佈您的非工作代碼及其輸出。 – Fred

+0

https://i.stack.imgur.com/0jCJL.png – user408340

+0

輸出:文件夾/文件名.txt:3 – user408340

回答

1

你用cut做了很好的努力。當您可以通過cut解決問題時,大多數情況下您都找到了一個可靠的快速解決方案。
在這種情況下,您需要修復cut命令會給出一個難看的結果。

# Ugly cutting 
grep -c "word" */*.txt | cut -d'/' -f2 | tr ':' '.' | cut -d"." -f1,3 | tr '.' ' ' 

固定cut是錯在這裏,但你可以學到很酷的事情

# going weird 
# Combine first colums 
grep -c "word" */*.txt | cut -d'/' -f2 | cut -d"." -f1 
# with second column 
grep -c "word" */*.txt | cut -d'/' -f2 | cut -d":" -f2 
# using paste and process substitution 
paste -d" " <(grep -c "word" */*.txt | cut -d'/' -f2 | cut -d"." -f1) <(grep -c "word" */*.txt | cut -d'/' -f2 | cut -d":" -f2) 

不,這不是解決這個問題的方法。使用sed

grep -c "word" */*.txt | sed 's#.*/##;s#\..*:# #' 
# or shorter 
grep -c "word" */*.txt | sed 's#.*/\([^.]*\).*:#\1 #' 
+0

非常感謝!我肯定從你的答案中學到了很多東西,但我會像你所建議的那樣使用sed。:) – user408340

+0

@ user408340如果此答案解決了您的問題,請考慮通過單擊複選標記來接受答案,以讓其他人知道問題已解決。 –

+0

完成。謝謝。 :) – user408340

相關問題