如何使用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
相关产品推荐
相关产品推荐

