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

如何使用AWK按字符长度拆分固定宽度格式的数据列?

用AWK处理固定宽度格式的数据

没问题,固定宽度格式的数据确实是AWK的强项!我来帮你搞定这份数据的拆分。

首先,我们需要明确每个字段的字符位置范围(AWK里字符串的索引从1开始)。分析你给出的数据,每个字段的宽度可以确定如下:

  • NODE:第1-2位(存储行号,比如1、2、3)
  • S1:第3-13位(包含小数或科学计数法的数值)
  • S2:第14-24位(科学计数法的数值,可能带负号)
  • S3:第25-31位(带负号的小数)
  • SINT:第32-38位(正数小数)
  • SEQV:第39-44位(正数小数)

AWK脚本实现

你可以用AWK的substr()函数按位置提取每个字段,再用你想要的分隔符(比如逗号、制表符)重新格式化输出。这里以逗号分隔为例:

# 跳过表头行并输出格式化后的表头
NR == 1 { print "NODE,S1,S2,S3,SINT,SEQV"; next }
# 处理数据行
{
    # 按固定位置提取字段
    node = substr($0, 1, 2)
    s1 = substr($0, 3, 11)
    s2 = substr($0, 14, 11)
    s3 = substr($0, 25, 7)
    sint = substr($0, 32, 7)
    seqv = substr($0, 39, 6)
    
    # 去除字段前后的空格(可选,按需调整)
    gsub(/^[[:space:]]+|[[:space:]]+$/, "", node)
    gsub(/^[[:space:]]+|[[:space:]]+$/, "", s1)
    gsub(/^[[:space:]]+|[[:space:]]+$/, "", s2)
    gsub(/^[[:space:]]+|[[:space:]]+$/, "", s3)
    gsub(/^[[:space:]]+|[[:space:]]+$/, "", sint)
    gsub(/^[[:space:]]+|[[:space:]]+$/, "", seqv)
    
    # 输出格式化后的行
    print node "," s1 "," s2 "," s3 "," sint "," seqv
}

使用方法

把上面的脚本保存为split_fixed_width.awk,然后在终端运行:

awk -f split_fixed_width.awk your_data_file.txt

灵活调整

如果某个字段的宽度不对,只需要修改substr()里的起始位置和长度参数即可。比如发现S3的实际长度是8位,就把substr($0,25,7)改成substr($0,25,8)。要是不需要去除空格,直接删掉那些gsub()行就行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:37:02