2016-12-15 5 views
0

Я должен создать скрипт, который сможет суммировать столбцы. Файл выглядит следующим образом:Несколько аргументов в сценарии оболочки с использованием awk

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

hmm, скрипт может выйти с информацией об неправильном аргументе, но пока я хочу только суммировать выбранные столбцы. – 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" означает столбцы, которые вы хотите сделать сумму , пространство разделено. Его можно установить с помощью переменной сценария оболочки: -v c="$var", awk выполнит вычисления и вывод.

С вашим примером файлом, указанные Однострочники выходами:

Sum:6 
+0

он работает, но я надеялся на незначительное обновление того, что я разместил, используя shift. – codddeer123

+0

@ codddeer123 вам не нужен сдвиг, просто соберите все параметры и создайте строку 'abcd' и перейдите к строке awk – Kent

+0

. Я придумал что-то вроде этого:' while [[$ # -gt 0]] do awk -vx = "$ 1" '{sum + = $ x} END {print sum}' plik.txt shift done' и после выполнения ./sum.sh 1 2 он возвращает 3 и 4, поэтому он добавляет первый и второй столбцы. Как добавить их вместе и получить окончательный ответ? – codddeer123

Смежные вопросы