Как посчитать сумму чисел из разных строк?

В двух словах :отличительная черта дистрибутива Linux состоит из:

  • Конфигурация ядра :да :все дистрибутивы происходят из одного и того же исходного кода, но между исходным кодом и фактическим двоичным файлом, работающим на компьютере, существует процесс компиляции, который включает «настройку», т.е. делая выбор.

  • Выбор программного обеспечения, создающего интерфейс между оборудованием и ядром, а также его конфигурация во время компиляции

  • Выбор программного обеспечения, которое создает интерфейс, который вы, пользователь, будете использовать. Именно здесь находится 99% кода дистрибутива. Опять же, все сводится к :, какое ПО выбрано, как оно настроено и скомпилировано.

Все эти варианты скрыты от вас в дистрибутиве, так как они уже созданы и «упакованы» для вас. Таким образом, дистрибутив Linux создается в расчете на то, что он подойдет большинству пользователей. Но побочным эффектом является то, что он плохо -настроен для ваших нужд.

Если вы хотите узнать много нового о том, как создаются дистрибутивы Linux, я предлагаю вам попробовать создать свой собственный дистрибутив. Мне очень помог проект «Linux From Scratch».

-4
22.03.2021, 12:48
3 ответа
$ sed -n '1p;3p' file | datamash -W sum 1-5
12      14      16      18      20

Сначала используется sedдля вывода только строк 1 и 3. Затем они передаются в GNU datamash, который должен просуммировать каждый отдельный столбец от столбца 1 до 5. -Wинструктирует datamashрассматривать любой набор пробелов как разделители полей.

Вывод разделен табуляцией -. Чтобы получить вывод, разделенный пробелом -, используйте параметр --output-delimiter=' 'сdatamash:

$ sed -n '1p;3p' file | datamash -W --output-delimiter=' ' sum 1-5
12 14 16 18 20
-1
28.04.2021, 22:58
awk 'NR==1 || NR==3 { for (i=1; i<=NF; i++) a[i]+=$(i)}END{for (i in a) printf "%s ", a[i]; print ""}'

Пример:

$ awk 'NR==1 || NR==3 { for (i=1; i<=NF; i++) a[i]+=$(i)}END{for (i in a) printf "%s ", a[i]; print ""}'' yourfilename
12 14 16 18 20
$ 

РЕДАКТИРОВАТЬ :Чтобы остановить чтение строк из файла после 3-й, мы можем выйти раньше. Однако вы не увидите заметной разницы с файлами, содержащими менее 10 тыс. строк.

awk 'NR==1 {split($0,a)} NR==3 {for (i in a) printf "%s ", a[i]+$i; print ""; exit}'

Доказательство того, что это работает с вашим примером:

$ cat yourfilename
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
...
$ awk 'NR==1 {split($0,a)} NR==3 {for (i in a) printf "%s ", a[i]+$i; print ""; exit}' yourfilename
12 14 16 18 20
$ 
-1
28.04.2021, 22:58

Решение 1

#!/bin/bash
{ read -ra line1; read _; read -ra line3; }
for i in "${!line1[@]}"; do
  result+=("$(( ${line1[i]} + ${line3[i]} ))")
done
printf %s\\n "${result[*]}"

Пример:

$ bash script < yourfilename
12 14 16 18 20
$ 

Объяснение сценария

{ read -ra line1; read _; read -ra line3; }Эта часть читает первые три строки файла, сохраняя только первые две строки. Он также разбивает их на массивы line1 и line3. Он предполагает поток данных из стандартного ввода. Посмотрите пример, как это сделать.

for i in "${!line1[@]}"; do result+=("$(( ${line1[i]} + ${line3[i]} ))"); doneЭта часть перебирает элементы одного из двух массивов и суммирует одни и те же элементы из строк 1 и 2. Результаты помещаются в новый массив с именем result

.

printf %s\\n "${result[*]}"Выводит вычисленные элементы массива, разделенные пробелом -.


Решение 2

Еще одно решение, позволяющее избежать циклов, при условии, что входные данные содержат 5 столбцов, как запрошено:

#!/bin/bash
{ read a b c d e; read _; read v w x y z; }
echo "$((a+v)) $((b+w)) $((c+x)) $((d+y)) $((e+z))"

Пример:

$ cat yourfilename
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
...
$ bash script < yourfilename
12 14 16 18 20
$ 

Объяснение сценария

{ read a b c d e; read _; read v w x y z; }Читает числа из строки 1 (соотв. строка 3 )в переменные от a до e (соотв. от v до я)

echo "$((a+v)) $((b+w)) $((c+x)) $((d+y)) $((e+z))"Выводит сумму переменных пробела -, разделенных по запросу

0
28.04.2021, 22:58

Теги

Похожие вопросы