You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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列:
    1. 匹配开头的大写字母+前导零,捕获后续有效数字,替换为数字+竖线
    2. 跳过第一列([^|]+匹配任意非竖线字符),处理第二列的字母和前导零
    3. 跳过前两列,处理第三列
    4. 跳过前三列,处理第四列
  • 该方法依赖前四列的结构(大写字母开头),若列结构变化需调整正则

内容的提问来源于stack exchange,提问作者ImSahil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 08:47:36