Удалить новую строку из вывода Cisco «show switch» и соединить ее с предыдущей строкой.

В два этапа с использованием двух временных файлов:

Первый шаг:Создайте промежуточный файл ровно с шестью столбцами как 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

Результатом является табуляция -с разделителями.

1
24.03.2020, 05:59
3 ответа
sed '1,2!{N;s/[[:blank:]]*\n[[:blank:]]*//;}' file

В каждой строке вне диапазона 1–2:

  • добавить следующую строку в пространство шаблонов
  • удалить начальные/конечные пробелы
2
28.04.2021, 23:19

Скажите, сработает ли это для вас:

sed 'H;1h;$!d;g;s/\n *  \([A-Z]*\)/\1/g' file
1
28.04.2021, 23:19

Использование 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;' 
0
06.11.2021, 23:08

Теги

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