2011-10-10 92 views
0

此代碼用於讀取文本文件的目錄並將其與input.txt匹配。我從input.txt中得到了單詞,但我不知道如何從文本文件中提取每個單詞並與之進行比較。該文件是段落形式,所以我不能尋找類似的人物等。有沒有辦法一次一個一個地閱讀每個單詞並進行比較?這裏如何從for循環中的文件逐字讀取


set -- $line 
    a=$(expr length "$file") 
     for i in '$line'; do 
        if [ "$i" = "$keyword" ]; then 
       count=`expr $count + 1`; 
      fi 
      done 

done <$file 

    echo "Profile: " $file 
    scorefile $value $count 
} 

scorefile() { 
    value="$1" 
    count="$2" 

    echo "Score: " $((value * count)) 

} 


while read line 
     do 
     set -- $line 
     keyword=$1 
      value=$2 

     echo "key: " $keyword 
     echo "value: " $value 

     for xx in `ls submissions/*` 
      do 
        filename=$xx 
        findkeyword $filename $keyword $value 
      done 
     done <input.txt 
+0

你已經做了'set - $ line'這正是你所要求的。你在這裏有「$ @」的字樣。 – tripleee

+0

另外引號''$ line''防止擴展。如果你拿出單引號,你的代碼應該做你想做的事(儘管還不是很優雅)。你似乎並沒有使用'a'的值,'set-$ line'在'findkeywords'函數中沒有做任何事情。 – tripleee

回答

2

#!/bin/bash 

findkeyword() { 
    file="$1" 
    keyword="$2"  
    value="$3" 

    count=0 
    while read line 
    do 

#problem要計算一個詞的出現次數在一個文件中,只使用grep -c(計數):

for word in $(<input.txt); do echo -n $word " " ; grep -c $word $file; done 

對於dir中的不同文件,從不使用ls。

for file in submissions/* 
do 
     echo "$file" 
     for word in $(<input.txt) 
     do 
      echo -n "$word " ; grep -c "$word" "$file" 
     done 
done 

¹in非常非常罕見的情況下,它可能是最好的解決辦法,但空格,換行和特殊字符的文件名會破壞你的命令。

+0

您應該使用'grep -w'或者'grep -F -w'來只計算精確的單詞匹配。這也無法更新分數。 – tripleee

+0

你確定問題是什麼? 「更新分數」是什麼意思?他是否在搜索所有文件中每個關鍵字的匹配總數? –

+0

問題描述當然意味着如果「as」是關鍵字,則不應包含例如「as」的出現次數。 「洗」在伯爵。限制匹配整個單詞可以防止這種情況發生。根據輸入,您也可以添加'-o'來分別在同一行上對多個事件進行計數。除此之外,我喜歡這個答案的清晰度,儘管它沒有實現所有問題的代碼,其中包括分數出現次數值。 – tripleee

相關問題