Как захватить заголовок файла, а затем выполнить дальнейшую текстовую обработку исходного файла? - PullRequest
0 голосов
/ 07 июня 2019

Я хотел бы захватить первые 8 строк следующего файла, а затем захватить все поля, где NPU # равен 7 или 3, а ядро ​​NPU равно 1.

RP/0/RP0/CPU0:xxxxx#show controllers npu voq-usage interface all instance all location 0/0/CPU0
33144 Tue Jun  4 xxxx
33145 -------------------------------------------------------------------
33146 Node ID: 0/0/CPU0
33147 Intf         Intf     NPU NPU  PP   Sys   VOQ   Flow   VOQ    Port
33148 name         handle    #  core Port Port  base  base   port   speed
33149 (hex)                                     type
33150 ----------------------------------------------------------------------
33151 Hu0/0/2/1    210       0   1   21    21   1024   4152 local   100G
33152 Hu0/0/2/47   218       7   0    1   701   1032   4152 local   100G
33153 Hu0/0/2/46   220       7   0    5   705   1040   4216 local   100G
33154 Hu0/0/2/45   228       7   0    9   709   1048   4280 local   100G
33155 Hu0/0/2/44   230       3   1   17   717   1056   4152 local   100G

Я могу сделать это с помощью следующих разрозненных команд awk:

awk 'NR<9' filename.txt
awk '($4==7||$4==3) && $5==1' filename.txt

Могу ли я получить несколько советов о том, как я могу присоединиться к этому заявлению awk вместе? Или, может быть, даже это было бы более элегантно для достижения этой цели?

Спасибо

Ответы [ 4 ]

2 голосов
/ 07 июня 2019

Я предлагаю использовать оператор || и сгруппировать второе условие:

awk 'NR<9 || (($4==7||$4==3) && $5==1)' filename.txt > newfilename.txt

См. онлайн демо :

s="RP/0/RP0/CPU0:xxxxx#show controllers npu voq-usage interface all instance all location 0/0/CPU0
33144 Tue Jun  4 xxxx
33145 -------------------------------------------------------------------
33146 Node ID: 0/0/CPU0
33147 Intf         Intf     NPU NPU  PP   Sys   VOQ   Flow   VOQ    Port
33148 name         handle    #  core Port Port  base  base   port   speed
33149 (hex)                                     type
33150 ----------------------------------------------------------------------
33151 Hu0/0/2/1    210       0   1   21    21   1024   4152 local   100G
33152 Hu0/0/2/47   218       7   0    1   701   1032   4152 local   100G
33153 Hu0/0/2/46   220       7   0    5   705   1040   4216 local   100G
33154 Hu0/0/2/45   228       7   0    9   709   1048   4280 local   100G
33155 Hu0/0/2/44   230       3   1   17   717   1056   4152 local   100G"

awk 'NR<9 || (($4==7||$4==3) && $5==1)'  <<< "$s"

Выход:

RP/0/RP0/CPU0:xxxxx#show controllers npu voq-usage interface all instance all location 0/0/CPU0
33144 Tue Jun  4 xxxx
33145 -------------------------------------------------------------------
33146 Node ID: 0/0/CPU0
33147 Intf         Intf     NPU NPU  PP   Sys   VOQ   Flow   VOQ    Port
33148 name         handle    #  core Port Port  base  base   port   speed
33149 (hex)                                     type
33150 ----------------------------------------------------------------------
33155 Hu0/0/2/44   230       3   1   17   717   1056   4152 local   100G
1 голос
/ 08 июня 2019

Это может сработать для вас (GNU sed):

sed -E '1,8b;/^(\S+\s+){3}[37]\s+1\s/!d' file

Вывести строки с 1 по 8 и любые строки, в которых 4-е поле равно 3 или 7, а 5-е поле равно 1.

1 голос
/ 07 июня 2019
awk '(NR<9) || (($4~/^[73]$/) && ($5==1))' filename.txt
1 голос
/ 07 июня 2019

Не могли бы вы попробовать еще 1 способ.

awk 'NR<=9{print;next} ($4==7||$4==3) && $5==1'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...