删除新行并将其与上一行连接
show switch
这是Cisco ACI 中命令的部分示例输出。
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_
SPN_01
ABCDEFGHIJ2 XYZ_
SPN_02
ABCDEFGHIJ3 XYZ_
SPN_03
我尝试了给出的解决方案将下一行与上一行合并
[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 ~]$
它几乎提供了我想要的输出,除了其中有额外的空间。
所需输出 1
Serial Number Name
---------------- ------------------
ABCDEFGHIJ1 XYZ_SPN_01
ABCDEFGHIJ2 XYZ_SPN_02
ABCDEFGHIJ3 XYZ_SPN_03
当我尝试使用show switch
具有更多列的实际输出时,实际问题就会发生。
[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
没有提供我想要的输出。
[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
几乎可以工作,但我不确定-----
格式有什么问题。
[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 ~]$
另一个awk
脚本尝试也产生与前一个sed
脚本几乎相似的输出
[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 ~]$
实际所需输出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
答案1
sed '1,2!{N;s/[[:blank:]]*\n[[:blank:]]*//;}' file
在 1-2 范围之外的每一行:
- 将下一行追加到模式空间
- 删除前导/尾随空格
答案2
告诉我这是否适合你:
sed 'H;1h;$!d;g;s/\n * \([A-Z]*\)/\1/g' file
答案3
使用 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
-med 以删除周围的空白,并且成对的行被分组在一起rotor: 2
(注意:rotor(2)
不在行尾时是必需的)。获取输出没有分组的行对之间的空格, usejoin("")
和 print-using-terminator,又名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
连续看到两个调用:一个-ped 用于连接相邻行且没有中间空格,第二个用于在捕获的之间map
添加回换行符\n
数据(已被例程处理的数据lines
):
raku -e 'raku -e '.put for lines[0...1]; lines.map(*.trim).rotor(2).map(*.join: "").join("\n").put;'