2016-12-15 174 views
0

我必須製作一個能夠對列進行求和的腳本。該文件看起來像這樣:使用awk的shell腳本中的多個參數

1 2 3 
1 2 
1 

在執行腳本,而不將參數./sum.sh我得到的所有列的總和所以答案是10,但我必須使它只添加某些列。例如./sum.sh 1 3應該總結第一和第三列,並給予6

我的代碼:

sum=0 

if [[ $# -eq 0 ]]; then 
    awk '{for(i=1;i<=NF;i++) sum+=$i;}; END {print sum}' plik.txt 
    else 
    exit 0; 
fi 

while [ $# -gt 0 ] 
do 
    awk '{sum +="$1"} END {print sum}' plik.txt 
    shift 
done 

我認爲我非常接近的解決方案,但必須有所缺失。

+0

有一個這裏沒有使用'awk'的好解決方案:http://stackoverflow.com/questions/33006845/how-to-sum-a-row-of-numbers-from-text-file-bash-shell -scripting,如果你打算做這樣的事情,讓'awk'確定每行是否有一個參數或更多參數可能會更好。 – Yaron

+0

但我必須使用awk來完成。我知道這段代碼並不是很糟糕,但只有一小部分我錯過了實現我想要的東西。 – codddeer123

+0

我提供的解決方案不會按照每行打印,如果您希望每行都計算總和,則需要進行一些小的更改。 – Yaron

回答

1

這裏是你的腳本和肯特的解決方案

#!/bin/bash 

file=plik.txt 

if [ $# -eq 0 ]; 
    then 
     awk  '{for(i=1;i<=NF;i++) sum+=$i} 
      END {print sum}' "$file" 
    else 
     awk -v cols="$*" 'BEGIN {split(cols,cs)} 
           {for(c in cs) sum+=$cs[c]} 
          END {print sum}' "$file"  
fi 

在動作的組合

$ ./sum.sh 1 
3 

$ ./sum.sh 
10 

$ ./sum.sh 1 3 
6 

$ ./sum.sh 1 2 
7 

$ ./sum.sh 1 2 3 4 
10 

$ ./sum.sh 1 2 3 
10 
0

這是我想出了,不需要bash條件:

awk 'BEGIN{sum=0} {if(NF==1) sum+=$1;else for(i=1;i<=NF;i++) sum+=$i;} END{print sum}' plik.txt

+0

'./sum.sh 3'返回10,'./sum.sh 2'也返回10,所以它不起作用。正如我所提到的,我只需要總結一些專欄。 './sum.sh 1 3'應該加上'plik.txt'文件的第一列和第三列 – codddeer123

+0

如果列不存在,我該怎麼辦? – Yaron

+0

嗯,腳本可以退出信息關於不正確的參數,但現在我只想總結選定的列。 – codddeer123

2

這一個班輪應該工作:

awk -v c="1 3" 'BEGIN{split(c,cols)} 
       {for(x in cols)s+=$cols[x]}END{print "Sum:"s}' file 

注意c="1 3"意味着你想要做的和列,空間分開。它可以由shell腳本變量設置:-v c="$var",awk將執行計算和輸出。

有了您的示例文件,上面的一行輸出:

Sum:6 
+0

它的工作原理,但我希望小幅升級我發佈的信息。 – codddeer123

+0

@ codddeer123你不需要移位,只是收集所有的參數,並建立'abcd'字符串,並傳遞給awk行 – Kent

+0

我想出了這樣的東西:'while [[$#-gt 0]] do awk -vx =「$ 1」'{sum + = $ x} END {print sum}'plik.txt shift done' and after executed ./sum.sh 1 2 it returns 3 and 4 it so added第一和第二列。如何將它們加在一起並得到最終答案? – codddeer123