2016-10-04 123 views
0

我想用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

回答

1

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