Bash expr错误

时间:2013-09-11 17:55:16

标签: linux bash

我有几个带数字的文本文件(结构如下)。我想总结一行文件的每一行与其他文件的行格式(来自file1的line1 +来自file2的line1等)。我已经编写了如下的bash脚本,但这给了我expr error

function countHourly () {


for i in {1..24}
    do
        for file in $PLACE/*.dailycount.txt
            do
            SECBUFF=`head -n $i $file`
             VAL=`expr $VAL + $SECBUFF` ## <-- this cause expr error

        done
      echo line $i form all files counts: $VAL
done

}    

文件结构* .dailycount.txt: 1 0 14 56 45 0 3 45 23 23 9(新行中的每个数字)。

3 个答案:

答案 0 :(得分:3)

假设您的文件每行包含24行,您可以使用简单的单行解决此问题:

counthourly() {
  paste -d+ $PLACE/*.dailycount.txt | bc
}

答案 1 :(得分:1)

head -n NUMBER FILE命令输出前NUMBER行。这意味着SECBUFF在循环的第二次运行中最终为1 0,而expr 1 + 2 3之类的内容不是有效表达式,因此您从expr收到错误。< / p>

您可以使用sed仅从文件中选择第n行,但我想知道您是否应该以某种方式重组该程序。

        SECBUFF=`sed -ne ${i}p $file`

答案 2 :(得分:0)

这可能会有所帮助。通过这种变化,您可以检查非常多的输入,这样即使有无效的行,也只会为总和添加数字。

function countHourly {
    local NUMBERS TOTAL=0 I

    readarray -t NUMBERS < <(cat "$PLACE"/*.dailycount.txt)

    for I in "${NUMBERS[@]}"; do
        [[ $I =~ ^[[:digit:]]+$ ]] && (( TOTAL += I ))
    done

    echo "Total: $TOTAL"
}

或者

function countHourly {
    local NUMBERS TOTAL=0 I

    while read I; do
        [[ $I =~ ^[[:digit:]]+$ ]] && (( TOTAL += I ))
    done < <(cat "$PLACE"/*.dailycount.txt)

    echo "Total: $TOTAL"
}