2013-02-06 38 views
2

我正在嘗試製作一個可執行文件,該文件將包含任意數量的文本文件,並提供按出現次數分配單詞的輸出。這是在bash腳本來完成,和我有什麼到目前爲止是:打印出多個文件中文字的分佈

#!/bin/bash 
y=$(cat $* | wc -w) 

cat $* | tr ' ' '//' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | 
grep -v '[^a-z]'| sort | uniq -c | sort -rn | head -$y 

我得到一個錯誤試圖設置y,我無法弄清楚如何讓head以其他方式打印出每一個字。

有沒有更好的方法打印出來?

+0

這是'貓'的好用法(兩次) - 沒有UUOC獎勵給你! –

回答

1

爲什麼要運行head?不能保證會有與文件中的文字一樣多的單詞;的確,實際上保證不會有(因爲會有一些重複的詞)。如果你想看到所有的數據,然後顯示所有的數據;請勿過濾sort -nr的輸出。

第一個tr只需要一個斜線,我想。通常情況下,您會將空白和標點符號映射到換行符(-s選項爲tr以將相鄰換行符壓縮爲1)。從第一個tr開始的斜槓作爲第三個tr的標點符號,所以它不明顯。我想,我希望看到這樣的:

cat "[email protected]" | 
tr -cs '[:alpha:]' '\n' |  # Convert any non-alpha character to newline 
tr '[:upper:]' '[:lower:]' | # Case-convert to lower case 
sort | uniq -c | sort -nr 

注意使用"[email protected]"而非$*;當您指定的文件名不包含空格時(新行,製表符等)沒有區別;當他們這樣做時,"[email protected]"表單是正確的,而$*不是,所以你可能總是使用"[email protected]"。這比$*更爲正確。

對於一些C源代碼我已經躺在附近,從腳本的輸出是:

246 n 
217 i 
153 int 
141 list 
124 if 
118 t 
103 char 
    99 a 
    97 size 
    90 buffer 
    89 context 
    82 d 
    81 void 
    79 include 
    79 h 
    78 s 
    65 for 
    62 j 
    55 ptr 
    54 r 
    54 const 
    53 static 
    53 sem 
    51 pthread 
    49 z 
    49 oldneedle 
    49 err 
    47 to 
    47 return 
    46 mutex 
    44 printf 
    43 error 
    43 c 

注意單詞「H」經常出現的詞「包括」;這是有原因的!單詞t出現很多,但這是因爲,例如,size_t被過濾處理爲兩個單詞。保留下劃線是可能的;將第一個tr更改爲使用'[:alpha:]_'(注意下劃線)。你消除了數字,但你可以保留這些,如果你想。

+0

我試過了,我仍然沒有輸出到終端。我將腳本命名爲wd,並使用[./wd file.txt]運行它,其中file.txt是輸入的文件 – BulletB

+0

真的嗎?嗯 - 這是令人驚訝的。沒有錯誤信息 - 我們需要逐步調試它。 (當然,它對我很有幫助;這就是我如何生成示例輸出。)我在這種情況下所做的是'tmp = $ {TMPDIR: -/tmp}/wd。$$;貓「$ @」| tee $ tmp.1 | tr -cs'[:alpha:]''\ n'| tee $ tmp.2 | ...',在每個令人擔憂的管道後添加一個'tee $ tmp.N'。在這裏,不要擔心'cat'後面的那個,也不要將它們添加到'sort | uniq -c | sort -nr';每個'tr'命令後加一個。運行該腳本,並查看第一個臨時文件。如果不正確,我們知道需要解決的問題。 –

+0

你把這個權利到終端或者它是一個腳本? – BulletB