我有一个文本文件,其中复制了命令输出。我需要解析单独列中的文本文件。
我在文本文件 port.txt 中有以下数据
NAME---SERIALNUMBER------FREE_PORTS
tx1 s4tx999d 0/1, 0/4,0/6
0/9,0/11
tx2 s4tx998f 1/2,0/9,,1/3
0/8,0/11,
1/7
tx3 s4tx997v 0/9
I require the output in the below format
NAME|SERIALNUMBER|FREE_PORTS
tx1|s4tx999d|0/1,0/4,0/6,0/9,0/11
tx2|s4tx998f|1/2,0/9,1/3,0/8,0/11,1/7
tx3|s4tx997v|0/9
我尝试使用以下命令,但它没有将所有 free_ports 聚合在一行中
cat ports.txt | cut -c1-5 -- For The Name
cat ports.txt | cut -c6-13 -- For SERIALNUMBER
cat ports.txt | cut -14-23 -- For Free ports
我将利用 GNU
AWK
来完成此任务,让 port.txt
内容为
NAME---SERIALNUMBER------FREE_PORTS
tx1 s4tx999d 0/1, 0/4,0/6
0/9,0/11
tx2 s4tx998f 1/2,0/9,,1/3
0/8,0/11,
1/7
tx3 s4tx997v 0/9
然后
awk 'BEGIN{RS="\n\n";ORS=""}{gsub(/\n[ \t]+/,",");gsub(/[ \t-]{3,}/,"|");print}' port.txt
提供输出
NAME|SERIALNUMBER|FREE_PORTS
tx1|s4tx999d|0/1, 0/4,0/6,0/9,0/11
tx2|s4tx998f|1/2,0/9,,1/3,0/8,0/11,,1/7
tx3|s4tx997v|0/9
说明:我通知 GNU
AWK
空行(即两个后续换行符)是行分隔符 (RS
),因此整个文件被视为单行。然后我使用gsub
,第一个将跨多行的端口转换为单行,第二个用于将分隔符(空格,TAB或破折号,3个或更多示例)更改为|
剪切字段。然后我使用 print
输出更改后的内容,观察我将输出字段分隔符 (OFS
) 设置为空行,否则将添加尾随换行符。如果您必须以任何价格清除它们,请注意保留空格前缀和空字符串端口,然后添加第三个gsub
来执行此操作。
(在 GNU Awk 5.1.0 中测试)