Мне нужно перебрать каждую строку этого файла, добавив каждое из значений из каждой строки вместе в Bash - PullRequest
0 голосов
/ 08 ноября 2019

Вот файл:

90     88     80      70
80     90     67      89
70     81     78      85
88     79     90      78
67     66     80      90
80     60     90      89

, например, мне нужно добавить 90, 88, 80 и 70 вместе из верхнего ряда.

Ответы [ 3 ]

4 голосов
/ 08 ноября 2019

Вы можете легко достичь этого с помощью awk:

$ cat numbers.txt 
90     88     80      70
80     90     67      89
70     81     78      85
88     79     90      78
67     66     80      90
80     60     90      89

$ awk '{print $1+$2+$3+$4}' numbers.txt 
328
326
314
335
303
319
3 голосов
/ 08 ноября 2019

Вот вам причудливое решение для Bash:

while IFS=$'\n' read -ra line; do 
  numbers=($line)
  echo $(IFS=+; echo "$((${numbers[*]}))")
done < foo.txt

По предложению другого пользователя его можно сократить до:

while read -ra numbers; do 
  echo $(IFS=+; echo "$((${numbers[*]}))")
done < foo.txt

По предложению другого пользователя, один echo можно удалить с помощью составного оператора вместо оператора подстановки команд:

while read -ra numbers; do 
  (IFS=+; echo "$((${numbers[*]}))")
done < foo.txt

Поскольку это помечено только Bash, это может быть полезным решением.

Согласно предложению @anishsaneвариант без модификации IFS в подоболочке:

while read -r line; do echo $(( 0 $(printf "+%s" $line) )); done < file
0 голосов
/ 08 ноября 2019

Приведенные ниже суммы независимо от количества столбцов.

while IFS="" read -r p || [ -n "$p" ]
do
    read -a pa <<< "$p"
    {
        echo "0"
        for i in "${pa[@]}"
        do
            echo "$i"
            echo '+'
        done
        echo "p"
    } | dc
done < filename.dat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...