如何为文件中的数字按固定位置插入指定分隔符?
批量转换时间数字格式的解决方案
你可以用gawk直接处理整个文件,通过自定义函数或字段拆分来批量转换每行的两个数字。以下是两种可行的方案:
方案1:使用字符串截取(更直观)
这个方法直接通过substr截取固定长度的字符段,拼接成目标格式:
gawk '{ function format_time(num) { return sprintf("%s:%s:%s,%s", substr(num,1,2), substr(num,3,2), substr(num,5,2), substr(num,7,3)) } match($0, /^([0-9]{9}) ===> ([0-9]{9})$/, parts) print format_time(parts[1]) " ===> " format_time(parts[2]) }' 你的文件名.txt
说明:
match函数匹配每行的结构,把两个9位数字捕获到parts数组中format_time函数负责将单个9位数字拆分为小时:分钟:秒,毫秒格式:- 前2位=小时,第3-4位=分钟,第5-6位=秒,最后3位=毫秒
- 最后将格式化后的两个数字和原箭头组合输出
方案2:复用你之前的FIELDWIDTHS思路
如果你更习惯用FIELDWIDTHS来拆分字段,可以用这个版本:
gawk '{ # 拆分出两个待处理的数字 split($0, nums, / ===> /) # 处理第一个数字 FIELDWIDTHS="2 2 2 3" $0 = nums[1] fmt1 = sprintf("%s:%s:%s,%s", $1, $2, $3, $4) # 处理第二个数字 $0 = nums[2] fmt2 = sprintf("%s:%s:%s,%s", $1, $2, $3, $4) print fmt1 " ===> " fmt2 }' 你的文件名.txt
使用方式:
把命令里的你的文件名.txt替换成你实际的文件路径即可。如果需要从标准输入读取内容(比如通过管道传递),可以去掉文件名,改成:
cat 你的文件名.txt | gawk '{...}'
内容的提问来源于stack exchange,提问作者kuninox
相关产品推荐
相关产品推荐

