2014-09-12 116 views
0

我需要編寫一個bash腳本,它將從包含文件列表的命令行輸入(文件)。然後,我需要在文件內部打開這些文件並逐字讀取它,並記錄列表中所有文件中每個單詞的出現次數。到目前爲止,它正在打印出文件內的文件列表,還有文件本身。這是我迄今爲止所擁有的。我是新來的bash腳本,所以我不知道如何做到這一點。我感謝任何幫助。謝謝Bash腳本從文件列表中讀取命令行中的文件

#!/bin/bash 

    wordArray=() 
    countArray=() 
    INPUT="$1"; 

    if [ -f "$INPUT" ] 
    then 
     find $name -type f 
     echo "$name"; 
    else 
     echo "$INPUT is not a file!"; 
    fi 
+1

我不明白這到底是怎麼可能做你說什麼它。你在哪裏設置'$ name'? – Barmar 2014-09-12 20:17:08

+0

爲什麼如果你在文件中有文件名,你需要'find'? – jm666 2014-09-12 20:26:16

回答

2

要計算在列表中的所有文件中的所有單詞的出現次數在一個文件中,你可以使用:

xargs grep -hoP '\b\w+\b' < file_with_list | sort | uniq -c 

例子:

文件列表。 txt

test1.txt 
test2.txt 

test1.txt的

hello world 

的test2.txt

hello word hello again 

運行:

xargs grep -hoP '\b\w+\b' < list.txt | sort | uniq -c 

打印

1 again 
    3 hello 
    2 word 

注意事項:

  • list.txt其文件名不能包含空格...
+0

工作。謝謝!如果我想按出現次數排序......我需要更改哪些內容? – 2014-09-13 01:12:55

+0

此外,它只需要打印輸出文件中的有效單詞...我知道如何檢查一個有效的單詞,但不在您編寫的代碼中。 – 2014-09-13 01:20:32

+0

聰明的解決方案 – ShaneQful 2014-09-13 16:14:25

-1

我認爲你正在尋找這樣的東西,而不是找到。

for name in $INPUT; do echo $name; done 

這將打印$ INPUT文件中的所有文件,當然您可以在該循環中執行其他任何操作。

+2

請測試您的腳本 - 這將只打印變量'$ INPUT'的內容而不是文件的內容,名稱存儲在INPUT ... – jm666 2014-09-12 20:35:44

+0

是的,這比使用find更好。謝謝。但是,我怎樣才能打開列表中的這些文件,將每個單詞讀入一個數組,以保持每個單詞的出現次數? – 2014-09-12 20:39:11

+0

做貓$的名字,而不是做echo $ name – vlp 2014-09-12 20:40:25

0

嘗試:

#!/bin/bash 

err() { echo "[email protected]" >&2; return 1; } 

printwords() { 
    echo "Wordcounts in the: [email protected]" 
    for i in "${!words[@]}" 
    do 
     echo "$i => ${words[$i]}" 
    done 
} 

input="$1" 
[[ -n $input ]] || err "Usage: $0 filename" || exit 1 
[[ -f $input ]] || err "File $input doesn't exists" || exit 2 

declare -A words 
while read -r file 
do 
    while read -r word 
    do 
     let words[$word]++ 
    done < <(grep -oP '\b\w+\b' "$file") 
done < "$input" 

printwords "$(cat "$input" | xargs)" 
+0

它不承認-A和正在打印:grep :::沒有這樣的文件或目錄 – 2014-09-12 21:58:59