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 

谢谢!

+2

我对于你想要做的事情有一段艰难的时间,但是在一个循环中逐行读取一个文件,然后逐个遍历该行中的字段,然后在awk中添加结果,看起来像是一种非常奇怪的方式解决你试图解决的任何问题。我在这里打赌,这个整个事情可以用一个awk命令完成。你能分享一个你的文件的例子,然后你的预期结果是什么? – JNevill

+1

一个问题是'print'输出的是整个输入行,而不是'sum'的值。 – chepner

+0

问题是我在每行不同数量的字段的不同文件上使用该脚本。每行的字段数量基本上都包含在$数字中。我添加了一个文件的样本,这个文件有4列,但正如我刚才提到的,这个数字可能不同。预期的结果将是每行的所有字段的总和。我希望这更有意义!让我知道是否还有其他我可以指定的东西。 – arielle

您拨打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