使用sed/awk根据首个逗号字段长度动态调整第二个逗号字段长度
CSV固定前两字段总长度处理方案
需求说明
- 待处理CSV文件首个逗号分隔字段长度不固定,需调整第二个逗号字段长度,满足公式:
第二个字段长度 = 15 - 第一个字段长度,最终保证前两个逗号字段总长度固定为15 - 此前尝试在逗号与非逗号内容间插入空格构造字段分隔符,会在所有逗号间隙、行首/行尾位置生成多余空格,未找到无需预插空格的直接生效方案
样例对照
输入文件(mycsv)内容
^,somefilename1,,somefoldername1, ^,,somefilename2,,somefoldername2, ^,,,somefilename3,,somefoldername3,
期望输出效果
^,somefilename1,,,,,,,,,,,,,,somefoldername1, ^,,somefilename2,,,,,,,,,,,,,somefoldername2, ^,,,somefilename3,,,,,,,,,,,,somefoldername3,
此前的错误尝试
使用sed插入空格构造分隔符的命令:
sed 's/([,^,])/ & /g' mycsv
执行后会生成大量多余空格,输出不符合预期:
^ , somefilename1 , , somefoldername1 , ^ , , somefilename2 , , somefoldername2 , ^ , , , somefilename3 , , somefoldername3 ,
后续尝试通过sed 's/,,*/ & /g'添加空格、再管道传递给sed 's/^ //g'移除行首空格,但始终未找到合适的awk方案完成字段长度调整。
直接可用的解决命令
不需要提前插入空格做分隔符,直接用awk按行处理即可,命令如下:
awk -F, 'BEGIN{OFS=""} { # 定位第二个逗号位置,切分前缀与剩余内容 split_pos = index(substr($0, index($0, ",")+1), ",") + index($0, ",") prefix = substr($0, 1, split_pos-1) suffix = substr($0, split_pos+1) # 计算需要补充的逗号数量 pad_num = 15 - length(prefix) pad_str = "" for(i=0; i<pad_num; i++) pad_str = pad_str "," # 拼接输出结果 print prefix "," pad_str suffix }' mycsv
逻辑说明
- 直接定位每行第二个逗号的位置,切分出前两个字段组成的前缀部分、以及第二个逗号之后的剩余内容,全程不依赖空格做分隔标记
- 根据前缀的实际长度计算需要补充的逗号数量,补到前两字段总长度为15后,直接拼接剩余内容输出
- 不会引入多余空格,处理结果和期望输出完全匹配,不需要多层sed管道嵌套,可直接扩展适配其他固定长度需求。
内容的提问来源于stack exchange,提问作者jrunner
相关产品推荐
相关产品推荐

