0

我有一些带有数字的文本文件(结构如下)。我想总结一个文件的每一行和其他文件的每一行(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每个数字都在新行中)。

4

3 回答 3

3

假设您的每个文件恰好包含 24 行,您可以用一个简单的单行来解决这个问题:

counthourly() {
  paste -d+ $PLACE/*.dailycount.txt | bc
}
于 2013-09-11T18:04:47.673 回答
1

head -n NUMBER FILE命令输出前 NUMBER 行。这意味着SECBUFF最终会1 0在循环的第二次运行,并且类似的东西expr 1 + 2 3不是一个有效的表达式,所以你会从expr.

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

        SECBUFF=`sed -ne ${i}p $file`
于 2013-09-11T18:02:18.330 回答
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"
}
于 2013-09-11T18:01:26.417 回答