В двух словах :отличительная черта дистрибутива Linux состоит из:
Конфигурация ядра :да :все дистрибутивы происходят из одного и того же исходного кода, но между исходным кодом и фактическим двоичным файлом, работающим на компьютере, существует процесс компиляции, который включает «настройку», т.е. делая выбор.
Выбор программного обеспечения, создающего интерфейс между оборудованием и ядром, а также его конфигурация во время компиляции
Выбор программного обеспечения, которое создает интерфейс, который вы, пользователь, будете использовать. Именно здесь находится 99% кода дистрибутива. Опять же, все сводится к :, какое ПО выбрано, как оно настроено и скомпилировано.
Все эти варианты скрыты от вас в дистрибутиве, так как они уже созданы и «упакованы» для вас. Таким образом, дистрибутив Linux создается в расчете на то, что он подойдет большинству пользователей. Но побочным эффектом является то, что он плохо -настроен для ваших нужд.
Если вы хотите узнать много нового о том, как создаются дистрибутивы Linux, я предлагаю вам попробовать создать свой собственный дистрибутив. Мне очень помог проект «Linux From Scratch».
$ 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
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
$
#!/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[*]}"
Выводит вычисленные элементы массива, разделенные пробелом -.
Еще одно решение, позволяющее избежать циклов, при условии, что входные данные содержат 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))"
Выводит сумму переменных пробела -, разделенных по запросу