
Exclua a nova linha e junte-a à linha anterior
Este é um exemplo parcial de saída de show switch
comando no Cisco ACI.
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_
SPN_01
ABCDEFGHIJ2 XYZ_
SPN_02
ABCDEFGHIJ3 XYZ_
SPN_03
Eu tentei a solução dada emMesclar a próxima linha com a linha anterior
[user@linux ~]$ sed 'H;1h;$!d;g;s/\n */ /g' sample.txt
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_ SPN_01
ABCDEFGHIJ2 XYZ_ SPN_02
ABCDEFGHIJ3 XYZ_ SPN_03
[user@linux ~]$
Quase forneceu a saída que eu queria, exceto que há espaço extra nele.
Saída Desejada 1
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_SPN_01
ABCDEFGHIJ2 XYZ_SPN_02
ABCDEFGHIJ3 XYZ_SPN_03
O problema real acontece quando tento com show switch
a saída real que tem mais colunas.
[user@linux ~]$ cat output.txt
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
[user@linux ~]$
sed 'H;1h;$!d;g;s/\n */ /g' output.txt
não forneceu a saída que eu queria.
[user@linux ~]$ sed 'H;1h;$!d;g;s/\n */ /g' output.txt
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
[user@linux ~]$
awk
quase funciona, mas não tenho certeza do que há de errado com a -----
formatação.
[user@linux ~]$ awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}' output.txt
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
[user@linux ~]$
Outra awk
tentativa de script também produzindo resultados quase semelhantes aos sed
do script anterior
[user@linux ~]$ awk -f script.awk output.txt
ID Pod Address In-Band IPv4 In-Band IPv6 OOB IPv4 OOB IPv6 Version Flags Serial Number Name ---- ---- --------------- --------------- ------------------------- --------------- ------------------------- ------------------ ----- ---------------- ------------------ 101 1192.168.1.10 0.0.0.0 :: 10.1.1.10 :: n9000-13.0(2n) asiv ABCDEFGHIJ1 ABC_ SPN_01 102 1192.168.1.11 0.0.0.0 :: 10.1.1.11 :: n9000-13.0(2n) asiv ABCDEFGHIJ2 ABC_ SPN_02 103 1192.168.1.12 0.0.0.0 :: 10.1.1.12 :: n9000-13.0(2n) asiv ABCDEFGHIJ3 ABC_ SPN_03
[user@linux ~]$
Saída Real Desejada 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
Responder1
sed '1,2!{N;s/[[:blank:]]*\n[[:blank:]]*//;}' file
Em cada linha fora do intervalo 1–2:
- anexe a próxima linha ao espaço padrão
- remover espaços iniciais/finais
Responder2
Diga-me se isso funciona para você:
sed 'H;1h;$!d;g;s/\n * \([A-Z]*\)/\1/g' file
Responder3
Usando Raku (anteriormente conhecido como Perl_6):
raku -e '.put for lines[0...1]; .join("").put for lines.map(*.trim).rotor: 2;'
OU
raku -e '.put for lines[0...1]; .put for lines.map(*.trim).rotor(2).map(*.join: "");'
Exemplo de entrada (1):
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_
SPN_01
ABCDEFGHIJ2 XYZ_
SPN_02
ABCDEFGHIJ3 XYZ_
SPN_03
Saída de amostra (1):
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_SPN_01
ABCDEFGHIJ2 XYZ_SPN_02
ABCDEFGHIJ3 XYZ_SPN_03
Resumidamente, as duas primeiras linhas (cabeçalho) são impressas com get.put xx 2;
. Em seguida lines
, são lidos (preguiçosamente), cada um é trim
-med para remover os espaços em branco circundantes e os pares de linhas são agrupados rotor: 2
(nota: rotor(2)
é necessário quando não está no final da linha). Para obter saídasemum espaço entre os pares de linhas agrupados, use join("")
e print-using-terminator, também conhecido como put
.
Também funciona para o segundo arquivo de amostra fornecido pelo OP (abaixo).
Exemplo de entrada (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
Exemplo de saída (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
Observação: você pode simplificar um pouco o código acima, com a ressalva de que verá duas join
chamadas seguidas: uma map
-ped para unir linhas adjacentes sem espaço intermediário e a segunda para adicionar \n
novas linhas entre capturadas dados (dados que foram mastigados pela lines
rotina):
raku -e 'raku -e '.put for lines[0...1]; lines.map(*.trim).rotor(2).map(*.join: "").join("\n").put;'