awk错误参数列表太长,只有两个变量
问题描述:
我想用awk(在一个循环内)使用从下面描述的bash脚本传递的变量来总结一个表(在文件中)的两个数字。我正在处理的数字($ value)是浮点值。 $值只包含一个数字。请注意,发生错误的行是126,125正常工作。awk错误参数列表太长,只有两个变量
111 while read line
112 do
120 n=2
121 sum=0
122
123 for x in $(seq 1 $number)
124 do
125 value=$(echo "$line" | awk -v n="$n" '{print $n}') # I am just getting the values to sum up here
126 sum=$(awk -v sum="$sum" -v value="$value" '{sum = sum + value; print sum}')
n=$((n+1))
129 done
done < $file
其中$ number是先前定义的。
我得到以下错误:
./script.sh: line 126: /bin/awk: Argument list too long
我只是想在这条线传递awk命令两个变量,任何想法,为什么我收到此错误?
在 “文件” 表的一个例子:
A -0.717616 -0.623398 -0.214494 -0.352871
B -0.19373 -0.140626 -0.0523623 0.0248858
C -0.0822092 -0.302354 0.347158 -0.0373262
D 0.310213 0.312805 0.114366 0.353496
E -0.175354 -0.0263985 -0.125694 -0.155082
谢谢!
答
您拨打awk
时有两个问题:您没有指定输入文件,因此它正在从其继承的标准输入(即while
循环也正在尝试读取的文件)中读取,并且它输出它读取的每一行,而不仅仅是sum
的值(在我输入时固定)。
这加起来的数字文件中,顺便一种非常低效的方法,但这里是一个修正版本:
while read line
do
n=2
sum=0
for x in $(seq 1 $number)
do
value=$(echo "$line" | awk -v n="$n" '{print $n}')
sum=$(awk -v sum="$sum" -v value="$value" 'BEGIN {sum = sum + value; print sum}' </dev/null)
n=$((n+1))
done
done < $file
更好的解决方案:
awk 'BEGIN {sum=0}
{for (i=2;i<=NF;i++) { sum = sum + $i }}
END {print sum}' < $file
+0
它的工作原理,谢谢!我知道这似乎是一种奇怪的方式去解决这个问题,我试图解释为什么我在评论我的帖子时是这样做的。无论如何,你写的东西都很棒。 – arielle
我对于你想要做的事情有一段艰难的时间,但是在一个循环中逐行读取一个文件,然后逐个遍历该行中的字段,然后在awk中添加结果,看起来像是一种非常奇怪的方式解决你试图解决的任何问题。我在这里打赌,这个整个事情可以用一个awk命令完成。你能分享一个你的文件的例子,然后你的预期结果是什么? – JNevill
一个问题是'print'输出的是整个输入行,而不是'sum'的值。 – chepner
问题是我在每行不同数量的字段的不同文件上使用该脚本。每行的字段数量基本上都包含在$数字中。我添加了一个文件的样本,这个文件有4列,但正如我刚才提到的,这个数字可能不同。预期的结果将是每行的所有字段的总和。我希望这更有意义!让我知道是否还有其他我可以指定的东西。 – arielle