В два этапа с использованием двух временных файлов:
Первый шаг:Создайте промежуточный файл ровно с шестью столбцами как tmpfile1
и файл с суммой всех трех Ti
групп какtmpfile2
:
awk '{ $6 = ($2 - $3)*$5; print }' OFS="\t" file | tee tmpfile1 |
awk '$1 == "Ti" && NR > 1 { print ++i, sum; sum = 0 } { sum += $6 } END { print ++i, sum }' OFS="\t" >tmpfile2
Первая команда awk
просто добавляет шестой столбец со значениями, рассчитанными по вашей формуле. tee
записывает результат в tmpfile1
, а также передает данные второй программе awk
.
Второй awk
подытоживает новую шестую колонку. Когда он достигает строки Ti
, если это не самая первая строка файла, он выводит текущую сумму и сбрасывает переменную sum
. Сумма для последнего набора строк выводится в блоке END
. Переменная i
увеличивается перед каждым выводом и является индексом, который вы хотели в этом столбце. Это создает файл tmpfile2
.
tmpfile1
:
Ti 1.9699858320 2.0810775390 4.162155079 5.20200 -0.577899
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976
Pb 4.1621550790 4.1621550790 4.192557641 3.39279 0
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012
Ti 6.1302323500 6.2584338990 4.192557641 5.23841 -0.671572
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
Pb 8.3547127200 8.3547127200 4.196295567 3.40984 0
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753
Ti 10.318243871 10.452860504 4.196295567 5.26652 -0.708961
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
Pb 12.551008287 12.551008287 4.193631562 3.43289 0
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429
tmpfile2
:
1 3.00125
2 3.08149
3 3.17763
Второй шаг:Склеить их вместе:
paste tmpfile1 tmpfile2
Получается
Ti 1.9699858320 2.0810775390 4.162155079 5.20200 -0.577899 1 3.00125
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976 2 3.08149
O 1.6428341970 2.0810775390 4.162155079 -2.14259 0.938976 3 3.17763
Pb 4.1621550790 4.1621550790 4.192557641 3.39279 0
O 3.7662066970 4.1621550790 4.192557641 -4.29652 1.7012
Ti 6.1302323500 6.2584338990 4.192557641 5.23841 -0.671572
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
O 5.8163744340 6.2584338990 4.192557641 -2.13267 0.942767
Pb 8.3547127200 8.3547127200 4.196295567 3.40984 0
O 7.9266344100 8.3547127200 4.196295567 -4.36260 1.86753
Ti 10.318243871 10.452860504 4.196295567 5.26652 -0.708961
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
O 9.9935741680 10.452860504 4.196295567 -2.13625 0.98115
Pb 12.551008287 12.551008287 4.193631562 3.43289 0
O 12.112224767 12.551008287 4.193631562 -4.38552 1.92429
Результатом является табуляция -с разделителями.
sed '1,2!{N;s/[[:blank:]]*\n[[:blank:]]*//;}' file
В каждой строке вне диапазона 1–2:
Скажите, сработает ли это для вас:
sed 'H;1h;$!d;g;s/\n * \([A-Z]*\)/\1/g' file
Использование Raku (, ранее известного как Perl _6):
raku -e '.put for lines[0...1];.join("").put for lines.map(*.trim).rotor: 2;'
ИЛИ
raku -e '.put for lines[0...1];.put for lines.map(*.trim).rotor(2).map(*.join: "");'
Ввод образца (1):
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_
SPN_01
ABCDEFGHIJ2 XYZ_
SPN_02
ABCDEFGHIJ3 XYZ_
SPN_03
Пример вывода (1):
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_SPN_01
ABCDEFGHIJ2 XYZ_SPN_02
ABCDEFGHIJ3 XYZ_SPN_03
Вкратце, первые две строки (заголовка )печатаются с get.put xx 2;
. Затем lines
читаются в (лениво ), каждаяtrim
-обрабатывается для удаления окружающих пробелов, а пары строк группируются вместе сrotor: 2
(примечание:rotor(2)
требуется, если не в конце -из -строки ). Чтобы получить вывод без пробела между сгруппированными парами строк, используйте join("")
и напечатайте -с терминатором -, также известным как put
.
Также работает для второго файла примера, предоставленного OP (ниже ).
Пример ввода (2):
ID Pod Address In-Band IPv4 In-Band IPv6 OOB IPv4 OOB IPv6 Version Flags Serial Number Name
---- ---- --------------- --------------- ------------------------- --------------- ------------------------- ------------------ ----- ---------------- ------------------
101 1 192.168.1.10 0.0.0.0 :: 10.1.1.10 :: n9000-13.0(2n) asiv ABCDEFGHIJ1 ABC_
SPN_01
102 1 192.168.1.11 0.0.0.0 :: 10.1.1.11 :: n9000-13.0(2n) asiv ABCDEFGHIJ2 ABC_
SPN_02
103 1 192.168.1.12 0.0.0.0 :: 10.1.1.12 :: n9000-13.0(2n) asiv ABCDEFGHIJ3 ABC_
SPN_03
Пример вывода (2):
ID Pod Address In-Band IPv4 In-Band IPv6 OOB IPv4 OOB IPv6 Version Flags Serial Number Name
---- ---- --------------- --------------- ------------------------- --------------- ------------------------- ------------------ ----- ---------------- ------------------
101 1 192.168.1.10 0.0.0.0 :: 10.1.1.10 :: n9000-13.0(2n) asiv ABCDEFGHIJ1 ABC_SPN_01
102 1 192.168.1.11 0.0.0.0 :: 10.1.1.11 :: n9000-13.0(2n) asiv ABCDEFGHIJ2 ABC_SPN_02
103 1 192.168.1.12 0.0.0.0 :: 10.1.1.12 :: n9000-13.0(2n) asiv ABCDEFGHIJ3 ABC_SPN_03
Примечание. :Вы можете немного упростить приведенный выше код с оговоркой, что вы увидите два join
вызова подряд :одинmap
-ped для соединения соседних строк без промежуточного пробела, и второй, чтобы добавить -обратно -в \n
новые строки между захваченными данными (данные, которые были съедены подпрограммой lines
):
raku -e 'raku -e '.put for lines[0...1]; lines.map(*.trim).rotor(2).map(*.join: "").join("\n").put;'