我有一个这样的文件:
123123213,456,be
124243233,4346,ytr
123123123,436535,uytr
324234324,322,yt
234324323,32,tyutr
我想用零填充中间字段以得到结果:
123123213,00000456,be
124243233,00004346,ytr
123123123,00436535,uytr
324234324,00000322,yt
234324323,00000032,tyutr
我如何编写一个可以实现这一功能的脚本?
我见过这样的例子
awk '{ $6=sprintf("%06s", $6); print $0}'
但我不太明白它,因此无法让它工作。
答案1
尝试这个:
awk -F , '{ printf "%i,%08i,%s\n" , $1 , $2 , $3 }' file
答案2
由于您标记了您的问题[sed]
,因此这里是sed
基于脚本的版本这里。
sed 's/[^,][^,]*/\n0000000&/2;s/\n[^,]*\(.\{8\}\),/\1,/' inputfile
解释:
- 一个字段由一组一个或多个非逗号组成:
[^,][^,]*
(也可以写成[^,]\+
) - 替换第二个字段(匹配)(
s///2
)一个换行符,一堆零和匹配的内容:\n0000000&
(换行符用于标记下一步字段的开始) - 现在匹配换行符、零个或多个非逗号以及恰好八个
\{8\}
任何字符(捕获这些字符\(\)
) 后跟逗号 - 替换捕获的字符
\1
对于匹配,这将删除临时换行符和多余的零
其工作方式是在字段开头添加多余的零,然后砍掉除
答案3
你问题中的命令是正确的,只需要一些更新。
awk '{ $6=sprintf("%0.8s", $6); print $0}'
也可以更改输出字段分隔符的使用:
awk '{ OFS="\xE7"; $6=sprintf("%0.8s", $6); print $0}'