我有几个带数字的文本文件(结构如下)。我想总结一行文件的每一行与其他文件的行格式(来自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
(新行中的每个数字)。
答案 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"
}