linux - AWK 脚本自动从字符串中删除前导 0

标签 linux bash awk

我有一个文件 BLACK.FUL.eg2:

10>BLACK.FUL>272/GSMA/000000>151006>01
15>004401074905590>004401074905590>B>I>0011>Insert>240/PLMN/000100>>5000-K525122-15
15>004402145955010>004402145955010>B>I>0011>Insert>240/PLMN/000100>>1200-K108534-14
15>004402146016260>004402146016360>B>I>0011>Insert>240/PLMN/000100>>1200-K-94878-14
15>004402452698630>004402452698630>B>I>0011>Insert>240/PLMN/000100>>5000-K538947-14
90>BLACK.FUL>272/GSMA/000000>151006>01>4

我编写了这个 AWK 脚本:

awk 'NR > 2 { print p } { p = $0 }' BLACK.FUL.eg2 | awk -F">" \
'{if (length($2) == 15) print substr($2,1,length($2)-1)","substr($3,1,length($3)-1)","$6","$8; \
else print $2","$3","$6","$8;}' | awk -F"," '{if ($2 == $1) print $1","$3","$4; \
else {if (length($1) > 14) {v = substr($1,9,6); t = substr($2,9,6); \
while(v <= t) print substr($2,1,8)v++substr($2,15,2)","$3","$4;} \
else {d = $1;while(d <= $2) print d++","$3","$4;}}}'

这给了我一个输出:

00440107490559,0011,240/PLMN/000100
00440214595501,0011,240/PLMN/000100
440214601626,0011,240/PLMN/000100
440214601627,0011,240/PLMN/000100
440214601628,0011,240/PLMN/000100
440214601629,0011,240/PLMN/000100
440214601630,0011,240/PLMN/000100
440214601631,0011,240/PLMN/000100
440214601632,0011,240/PLMN/000100
440214601633,0011,240/PLMN/000100
440214601634,0011,240/PLMN/000100
440214601635,0011,240/PLMN/000100
440214601636,0011,240/PLMN/000100
00440245269863,0011,240/PLMN/000100

有一个问题:field1 中字符串的前导 0 由于对其进行数字运算而自动被删除。所以我的实际预期输出是:

00440107490559,0011,240/PLMN/000100
00440214595501,0011,240/PLMN/000100
00440214601626,0011,240/PLMN/000100
00440214601627,0011,240/PLMN/000100
00440214601628,0011,240/PLMN/000100
00440214601629,0011,240/PLMN/000100
00440214601630,0011,240/PLMN/000100
00440214601631,0011,240/PLMN/000100
00440214601632,0011,240/PLMN/000100
00440214601633,0011,240/PLMN/000100
00440214601634,0011,240/PLMN/000100
00440214601635,0011,240/PLMN/000100
00440214601636,0011,240/PLMN/000100
00440245269863,0011,240/PLMN/000100

为此,我正在尝试以下更新的 AWK 脚本:

awk 'NR > 2 { print p } { p = $0 }' BLACK.FUL.eg2 | awk -F">" \
'{if (length($2) == 15) print substr($2,1,length($2)-1)","substr($3,1,length($3)-1)","$6","$8; \
else print $2","$3","$6","$8;}' | awk -F"," '{if ($2 == $1) print $1","$3","$4; \
else {if (length($1) > 14) {v = substr($1,9,6); t = substr($2,9,6); \
while(v <= t) print substr($2,1,8)v++substr($2,15,2)","$3","$4;} \
else {d = $1; for ( i=1;i<length($1);i++ ) if (substr($1,i++,1) == "0") \
{m=m"0"; else exit 1;}; while(d <= $2) print md++","$3","$4;}}}'

但是出现错误:

awk: cmd. line:4: {m=m"0"; else exit 1;}; while(d <= $2) print   md++","$3","$4;}}}
awk: cmd. line:4:          ^ syntax error

您能否强调一下我在实现预期输出方面做错了什么?仅对我现有的 AWK 脚本进行修改会有很大帮助。谢谢

注意:前导 0 可以出现任意次数,而不是像上面的示例输出那样每次都出现 2 个 0。

最佳答案

由于您的字段大小是固定的,因此对于给定的示例,只需将最后一个打印语句更改为

$ awk ... printf "%014d,%s,%s\n",d++,$3,$4}}}'

00440107490559,0011,240/PLMN/000100
00440214595501,0011,240/PLMN/000100
00440214601626,0011,240/PLMN/000100
00440214601627,0011,240/PLMN/000100
00440214601628,0011,240/PLMN/000100
00440214601629,0011,240/PLMN/000100
00440214601630,0011,240/PLMN/000100
00440214601631,0011,240/PLMN/000100
00440214601632,0011,240/PLMN/000100
00440214601633,0011,240/PLMN/000100
00440214601634,0011,240/PLMN/000100
00440214601635,0011,240/PLMN/000100
00440214601636,0011,240/PLMN/000100
00440245269863,0011,240/PLMN/000100

更新

如果您的字段大小不固定,您可以捕获长度(或所需长度)并使用相同的模式。由于您的代码太复杂,我将编写一个概念证明,您可以将其嵌入到您的脚本中。

这本质上是你的问题,增加一个零填充的数字并删除前导零。

$ echo 0001 | awk '{$1++; print $1}'
2

这是提出的具有零填充参数长度的解决方案。

$ echo 0001 | awk '{n=length($1); $1++; printf "%0"n"s\n", $1}'
0002

关于linux - AWK 脚本自动从字符串中删除前导 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35852629/

相关文章:

linux - 在 linux 内核的上下文中,硬件 "gates"是什么?

regex - awk 提取文本第 N 次出现的方括号(包含文件文本中的换行符)

java - TaskManager for linux - Java Swing 在 Linux 上工作吗?

linux - 容器 - 如果不能跨平台运行,它们有什么好处

c++ - 在 Windows 7 中交叉编译 C 和 C++ 应用程序,在 linux 下使用 MinGW

linux - top 通过命令行选项添加过滤器命令

bash - bash 中的多行赋值

bash - 从 Windows PowerShell 运行 bash 脚本

linux - 关于使用 bash/sed/awk 脚本重新排序网络路由文件的方法的思考

variables - 将变量作为参数传递给 TCL 中的 awk 文件