
Neue Zeile löschen und mit vorheriger Zeile verbinden
Dies ist eine teilweise Beispielausgabe des show switch
Befehls in Cisco ACI.
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_
SPN_01
ABCDEFGHIJ2 XYZ_
SPN_02
ABCDEFGHIJ3 XYZ_
SPN_03
Ich habe die Lösung von ausprobiert.Nächste Zeile mit vorheriger Zeile zusammenführen
[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 ~]$
Es lieferte fast die gewünschte Ausgabe, außer dass es zusätzlichen Speicherplatz enthielt.
Gewünschte Ausgabe 1
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_SPN_01
ABCDEFGHIJ2 XYZ_SPN_02
ABCDEFGHIJ3 XYZ_SPN_03
Das eigentliche Problem tritt auf, wenn ich es mit einer tatsächlichen show switch
Ausgabe versuche, die mehr Spalten hat.
[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
lieferte nicht die gewünschte Ausgabe.
[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
funktioniert fast, aber ich bin nicht sicher, was mit der Formatierung nicht stimmt -----
.
[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 ~]$
Ein weiterer awk
Skriptversuch erzeugt ebenfalls eine fast ähnliche Ausgabe wie das vorherige sed
Skript.
[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 ~]$
Tatsächlich gewünschte Ausgabe 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
Antwort1
sed '1,2!{N;s/[[:blank:]]*\n[[:blank:]]*//;}' file
In jeder Zeile außerhalb des Bereichs 1–2:
- Füge die nächste Zeile zum Musterbereich hinzu
- führende/nachgestellte Leerzeichen entfernen
Antwort2
Sagen Sie mir, ob das für Sie funktioniert:
sed 'H;1h;$!d;g;s/\n * \([A-Z]*\)/\1/g' file
Antwort3
Verwendung von Raku (früher bekannt als Perl_6):
raku -e '.put for lines[0...1]; .join("").put for lines.map(*.trim).rotor: 2;'
ODER
raku -e '.put for lines[0...1]; .put for lines.map(*.trim).rotor(2).map(*.join: "");'
Beispieleingabe (1):
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_
SPN_01
ABCDEFGHIJ2 XYZ_
SPN_02
ABCDEFGHIJ3 XYZ_
SPN_03
Beispielausgabe (1):
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_SPN_01
ABCDEFGHIJ2 XYZ_SPN_02
ABCDEFGHIJ3 XYZ_SPN_03
Kurz gesagt werden die ersten beiden (Header-)Zeilen mit gedruckt get.put xx 2;
. Dann lines
werden sie (verzögert) eingelesen, jede Zeile wird mit trim
-med versehen, um umgebende Leerzeichen zu entfernen, und Zeilenpaare werden mit gruppiert rotor: 2
(Hinweis: rotor(2)
ist erforderlich, wenn nicht am Zeilenende). Um die Ausgabe zu erhaltenohneein Leerzeichen zwischen den gruppierten Zeilenpaaren, verwenden Sie join("")
und den Print-With-Terminator, auch bekannt als put
.
Funktioniert auch für die zweite Beispieldatei, die von OP bereitgestellt wird (unten).
Beispieleingabe (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
Beispielausgabe (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
Hinweis: Sie können den obigen Code ein wenig rationalisieren, allerdings mit der Einschränkung, dass Sie join
dann zwei Aufrufe hintereinander sehen werden: einen -ped, um benachbarte Zeilen ohne dazwischenliegendes Leerzeichen zu verbinden, und den zweiten, um zwischen den erfassten Daten (Daten, die von der Routine übernommen wurden) neue Zeilen map
wieder einzufügen :\n
lines
raku -e 'raku -e '.put for lines[0...1]; lines.map(*.trim).rotor(2).map(*.join: "").join("\n").put;'