【问题标题】:How to read word by word from a file in a for loop如何在for循环中逐字读取文件
【发布时间】:2011-12-04 21:35:11
【问题描述】:

此代码是读取文本文件的目录并将其与 input.txt 匹配。我从 input.txt 中得到了这个词,但我不知道如何从文本文件中提取每个词并进行比较。该文件是段落形式,所以我无法寻找类似的字符等。有没有办法一次一个地阅读每个单词并进行比较?

#!/bin/bash

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

    count=0
    while read line
    do

#问题就在这里


    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

【问题讨论】:

  • 你已经做了set -- $line,这正是你所要求的。此时你已经有了“$@”中的单词。
  • 另外引用'$line' 可以防止扩展。如果你去掉单引号,你的代码应该做你想做的事(尽管仍然不是很优雅)。您似乎根本没有使用a 的值,并且set -- $line 在findkeywords 函数中没有做任何事情。

标签: bash unix loops


【解决方案1】:

要计算文件中某个单词的出现次数,只需使用 grep -c (count):

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

对于目录中的不同文件,永远不要使用 ls。

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

¹在非常非常罕见的情况下,它可能是最好的解决方案,但文件名中的空格、换行符和特殊字符会破坏您的命令。

【讨论】:

  • 您应该使用grep -w 或grep -F -w 只计算完全匹配的单词。这也无法更新分数。
  • 您确定问题是什么? update the scores 是什么意思?他是否在所有文件中搜索每个关键字的匹配总和?
  • 问题描述当然暗示我如果“as”是一个关键字,你不应该包括例如的出现。 “洗”在计数。将匹配限制为整个单词可以防止这种情况。根据输入,您还可以添加 -o 以分别计算同一行上的多次出现。除此之外,我喜欢这个答案的清晰性,尽管它没有实现所有问题的代码,其中包括分数出现次数的值。
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2013-10-04
  • 2015-03-11
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多