Unix环境下拆分最后一列并保留前三位数字的技术需求
解决Unix环境下文本列拆分替换的问题
刚好我经常处理这类结构化文本数据,给你几个实用的Unix工具方案,轻松搞定这个需求:
方案1:用awk实现(推荐,灵活通用)
awk是处理文本列的利器,能直接定位最后一列并完成修改:
awk '{ $NF = substr($NF, 1, 3); print }' 你的输入文件名 > 输出文件名
- 细节说明:
$NF代表当前行的最后一列(NF是Number of Fields的缩写,自动识别列数)substr($NF, 1, 3)从最后一列的第1个字符开始截取3个字符(也就是你要的前三位数字)- 把截取后的结果重新赋值给
$NF,再用print输出整行,就完成了原列的替换
方案2:用sed实现(适合行级正则替换)
如果习惯用sed做文本匹配替换,也可以通过定位行尾的6位数字来完成:
sed -E 's/([0-9]{3})([0-9]{3})$/\1/' 你的输入文件名 > 输出文件名
- 细节说明:
-E启用扩展正则表达式,不用给括号加转义符,写法更简洁- 正则
([0-9]{3})([0-9]{3})$精准匹配行尾的6位数字,把前三位捕获到分组\1里 - 用
\1替换整个6位数字,相当于只保留前三位内容
方案3:用cut+paste组合实现(适合简单列场景)
如果更习惯用基础文本工具组合,也可以拆分后再拼接:
# 统计第一行的列数,计算前n-1列的范围 col_count=$(head -n1 你的输入文件名 | wc -w) # 提取除最后一列外的所有内容到临时文件 cut -d' ' -f1-$((col_count-1)) 你的输入文件名 > temp1.txt # 提取最后一列的前三位到临时文件 cut -d' ' -f$col_count 你的输入文件名 | cut -c1-3 > temp2.txt # 拼接两个临时文件得到最终结果 paste -d' ' temp1.txt temp2.txt > 输出文件名 # 清理临时文件 rm temp1.txt temp2.txt
- 细节说明:
- 先用
wc -w统计第一行的列数,避免手动数列的麻烦 - 第一个
cut提取前n-1列,第二个cut提取最后一列并截取前三位 - 最后用
paste把两部分按空格拼接成完整行
- 先用
额外注意
如果你的数据列分隔符不是空格(比如制表符\t),需要调整对应参数:
- awk默认支持空格和制表符作为分隔符,无需修改
- sed不受分隔符影响,无需调整
- cut和paste需要把
-d' '改成-d$'\t'
内容的提问来源于stack exchange,提问作者Earthshaker
相关产品推荐
相关产品推荐

