Unix下用sed/awk处理竖线分隔文件:移除前四列字符与前导零
处理竖线分隔文件前四列的字符与前导零
问题描述
我有一个包含千余行的竖线分隔文件abc.txt,示例内容如下:
ABC00001|DEF00001|GHI00101|JKL01126|10|31|62|143|202301|01-01-2023 ABC00002|DEF00002|GHI00102|JKL01127|11|32|63|144|202301|01-01-2023 ABC00003|DEF00003|GHI00103|JKL01128|12|33|64|145|202301|01-01-2023
需要移除前四列中的字母字符及前导零,输出格式如下:
1|1|101|1126|10|31|62|143|202301|01-01-2023 2|2|102|1127|11|32|63|144|202301|01-01-2023 3|3|103|1128|12|33|64|145|202301|01-01-2023
我熟悉sed的单值处理,但对多列竖线文件操作不熟悉,曾尝试命令echo ABC00001 | cut -c 4- | sed 's/^0*//'得到结果1,但不知如何批量处理所有列,请问如何用sed或awk实现需求?
解决方案
方法一:使用awk实现
awk对多列文本的处理更灵活,可直接按分隔符拆分列并单独修改:
awk -F'|' -v OFS='|' '{ gsub(/[^0-9]/, "", $1); $1 += 0 gsub(/[^0-9]/, "", $2); $2 += 0 gsub(/[^0-9]/, "", $3); $3 += 0 gsub(/[^0-9]/, "", $4); $4 += 0 print $0 }' abc.txt
说明:
-F'|'指定输入列分隔符为竖线,OFS='|'设置输出分隔符也为竖线,保证输出格式一致gsub(/[^0-9]/, "", $n):删除第n列中所有非数字字符$n += 0:将处理后的字符串转为数字,自动去除前导零(若列内容全为零,会转为0,符合需求)- 处理完前四列后,直接打印整行,保留后续列的原始内容
方法二:使用sed实现
通过多次正则匹配替换,精准定位前四列进行处理:
sed -E ' s/^[A-Z]+0*([0-9]+)\|/\1|/; s/^[^|]+\|[A-Z]+0*([0-9]+)\|/\1|/; s/^[^|]+\|[^|]+\|[A-Z]+0*([0-9]+)\|/\1|/; s/^[^|]+\|[^|]+\|[^|]+\|[A-Z]+0*([0-9]+)\|/\1|/ ' abc.txt
说明:
-E启用扩展正则表达式,简化语法- 四条替换命令依次处理第1到第4列:
- 匹配开头的大写字母+前导零,捕获后续有效数字,替换为数字+竖线
- 跳过第一列(
[^|]+匹配任意非竖线字符),处理第二列的字母和前导零 - 跳过前两列,处理第三列
- 跳过前三列,处理第四列
- 该方法依赖前四列的结构(大写字母开头),若列结构变化需调整正则
内容的提问来源于stack exchange,提问作者ImSahil
相关产品推荐
相关产品推荐

