bash中的脚本出错

时间:2012-08-05 12:56:44

标签: linux bash sed

我在bash中编写的脚本有一点错误,我无法弄清楚我做错了什么

请注意,我正在使用此脚本进行数千次计算,此错误只发生了几次(如20次左右),但仍然发生了

脚本的作用是这样的:基本上它输入了一个我从一个带有实用程序w3m的站点获得的网页,它计算了所有出现的单词...在它从最常见的命令之后只发生一次

这是代码:

#!/bin/bash
#   counts the numbers of words from specific sites                       #
#   writes in a file the occurrences ordered from the most common         #

touch check         # file used to analyze the occurrences
touch distribution      # final file ordered

page=$1             # the web page that needs to be analyzed
occurrences=$2          # temporary file for the occurrences
dictionary=$3                       # dictionary used for another purpose (ignore this)

# write the words one by column
cat $page | tr -c [:alnum:] "\n" | sed '/^$/d' > check

# lopp to analyze the words
cat check | while read words
do
    word=${words}
    strlen=${#word}
    # ignores blacklisted words or small ones
    if ! grep -Fxq $word .blacklist && [ $strlen -gt 2 ]
    then
        # if the word isn't in the file
        if [ `egrep -c -i "^$word: " $occurrences` -eq 0 ]
        then
            echo "$word: 1" | cat >> $occurrences
        # else if it is already in the file, it calculates the occurrences
        else
            old=`awk -v words=$word -F": " '$1==words { print $2 }' $occurrences`
                    ### HERE IS THE ERROR, EITHER THE LET OR THE SED ###
            let "new=old+1"
            sed -i "s/^$word: $old$/$word: $new/g" $occurrences
        fi
    fi
done

# orders the words
awk -F": " '{print $2" "$1}' $occurrences | sort -rn | awk -F" " '{print $2": "$1}' > distribution

# ignore this, not important
grep -w "1" distribution | awk -F ":" '{print $1}' > temp_dictionary

for line in `cat temp_dictionary`
do
    if ! grep -Fxq $line $dictionary
    then
        echo $line >> $dictionary
    fi
done

rm check
rm temp_dictionary

这是错误:(我正在翻译它,所以英语可能会有所不同)

./wordOccurrences line:30 let:x // where x is a number, usually 9 or 10 (but also 11, 13, etc)
1: syntax error in the espression (the error token is 1)
sed: expression -e #1, character y: command 's' not terminated // where y is another number (this one is also usually 9 or 10) with y being different from x

编辑: 与kev交谈看起来这是一个换行问题

我在let和sed之间添加了一个回显来打印sed,它完美地运行了5到10分钟,直到出现错误。通常没有错误的sed看起来像这样:

s / ^ CONSULENTI:6 $ / CONSULENTI:7 / g

但是当我收到错误时就是这样:

s / ^ 00145:1 1 $ / 00145:4 / g

如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

如果你在$ old中得到一个新行,这意味着awk会打印两行,所以在$ occurences中有一个重复。

脚本似乎很难计算单词,而且效率不高,因为它在循环中启动了许多进程和进程文件; 也许你可以用

做类似的事情
sort | uniq -c

答案 1 :(得分:1)

您还应该考虑到整个计划中您的案例不敏感性并不一致。我在其中创建了一个只有“foooo”的页面并运行程序,然后在其中创建一个带有“Foooo”的程序并再次运行程序。 'old =`awk ...'行将'old'设置为空字符串,因为awk匹配大小写敏感。这会导致出现文件未更新。随后的sed以及可能的一些greps也区分大小写。

这可能不是唯一的错误,因为它没有解释您看到的错误消息,但它表明您的脚本将错误地处理具有不同大小写的相同单词。

以下内容将单词分开,将它们小写,然后删除小于三个字符的单词:

tr -cs '[:alnum:]' '\n' <foo | tr '[:upper:]' '[:lower:]' | egrep -v '^.{0,2}$'

在脚本的前面使用它将意味着脚本的其余部分不必区分大小写不正确。