You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux数据提取分组异常:如何合并port.txt中多行FREE_PORTS至单行

问题描述

有一个复制了命令输出的文本文件port.txt,需要将其解析为竖线分隔的分栏格式。

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

需要输出的目标格式:

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

尝试过用cut命令拆分列,但无法将多行的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

求可行的解决方案。

解决方案

可以用awk结合sed来处理这类多行续合的文本,以下是完整命令:

awk '
BEGIN { print "NAME|SERIALNUMBER|FREE_PORTS" }
/^[a-z]/ {
    if (name != "") {
        printf "%s|%s|%s\n", name, serial, ports
        ports = ""
    }
    name = $1
    serial = $2
    ports = $3
}
/^[[:space:]]+/ {
    gsub(/^[[:space:]]+/, "", $0)
    if ($0 != "") {
        ports = ports "," $0
    }
}
END {
    printf "%s|%s|%s\n", name, serial, ports
}' port.txt | sed 's/,,/,/g; s/,$//'

命令说明

  1. awk部分:
    • BEGIN块:先输出目标格式的表头
    • 匹配以小写字母开头的行(即包含设备名称和序列号的起始行):如果不是第一条数据,先输出上一条的聚合结果;然后提取当前行的NAME、SERIALNUMBER和初始的端口内容
    • 匹配以空白字符开头的行(即端口续行):去掉行首空白,将当前行的端口内容追加到端口变量中,用逗号分隔
    • END块:输出最后一条设备的聚合结果
  2. sed部分:
    • s/,,/,/g:将连续的逗号替换为单个逗号(处理原数据中的空端口项)
    • s/,$//:去掉行尾多余的逗号(处理原数据续行末尾的逗号)

执行该命令后,输出结果会完全符合你的目标格式。

内容的提问来源于stack exchange,提问作者stacktesting

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:13:23