Unix环境下删除|分隔文件第20列最后一个字符的方法
如何删除分隔文件指定列的最后一个字符
针对你需要处理的|分隔文件——删除第20列最后一个字符的需求,这里提供两种实用的Unix命令方案,完美适配变长记录的场景:
方法一:用awk(推荐,逻辑清晰好维护)
awk本来就是处理分隔字段的一把好手,这个需求用它来做最直观:
awk -F'|' -v OFS='|' '{ $20 = substr($20, 1, length($20)-1); print }' input.txt > output.txt
命令说明:
-F'|':告诉awk,输入的字段是用|分隔的-v OFS='|':确保输出时依旧用|分隔,保持原文件格式不变$20 = substr($20, 1, length($20)-1):直接定位到第20列,用substr函数截掉最后一个字符——从第1个字符开始截取,长度比原字段少1即可print:将修改后的整行输出到output.txt中
如果担心第20列可能为空(长度为0),可以加个判断避免报错:
awk -F'|' -v OFS='|' '{ if (length($20) > 0) $20 = substr($20, 1, length($20)-1); print }' input.txt > output.txt
方法二:用sed(适合快速文本替换)
如果你更习惯sed的正则玩法,也可以用这个方案:
sed -E 's/(([^|]*\|){19})([^|]+)(.)/\1\3/' input.txt > output.txt
正则逻辑说明:
-E:启用扩展正则表达式,让语法更简洁- 正则
(([^|]*\|){19})([^|]+)(.)将行拆分为三部分:(([^|]*\|){19}):匹配前19个|分隔的完整字段(从行首到第19个|的所有内容)([^|]+):匹配第20列的全部内容(除|以外的所有字符)(.):专门捕获第20列的最后一个字符
- 替换为
\1\3,即保留前19个字段的内容,加上去掉最后一个字符的第20列内容,正好实现需求
小技巧:原地修改文件
如果不想生成新文件,直接修改原文件的话,GNU awk和sed都支持原地编辑:
- awk版本:
awk -i inplace -F'|' -v OFS='|' '{ $20 = substr($20, 1, length($20)-1); print }' input.txt - sed版本:
sed -i -E 's/(([^|]*\|){19})([^|]+)(.)/\1\3/' input.txt
内容的提问来源于stack exchange,提问作者Abhinay
相关产品推荐
相关产品推荐

