在UNIX中使用sed或awk命令替换管道分隔文件中的前导0(& L)

b4qexyjb  于 2023-03-18  发布在  Unix
关注(0)|答案(3)|浏览(169)

我有这个下面的样本文件abc.txt超过1000行

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

我需要从文件的前四列中删除字符和前导0。输出应该如下所示

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或awk命令实现这一点?
我是awk的新手,我已经多次使用sed命令来处理单个值,但是作为管道分隔符文件&在多个列上执行操作,我从来没有这样做过。
我尝试了echo ABC00001 | cut -c 4- | sed 's/^0*//',结果是1。我不知道如何将其合并到所有列的脚本中。

xpszyzbs

xpszyzbs1#

我将使用GNU AWK来完成以下任务,让file.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

那么

awk 'BEGIN{FS=OFS="|"}{for(i=1;i<=4;i+=1){sub(/^[[:alpha:]]+0*/,"",$i)};print}' file.txt

给出输出

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

说明:我通知GNU AWK管道字符既是字段分隔符(FS)也是输出字段分隔符(OFS)。我使用for循环将以下更改应用于第1列到第4列(含):使用空字符串替换一个或多个(+)前导(^)字母字符([[:alpha:]]),后跟零字符(0),重复零次或多次(*),即删除它们。完成后,I print行。

  • (在GNU Awk 5.0.1中测试)*
zbwhf8kr

zbwhf8kr2#

使用任何sed:

$ sed 's/[A-Z][A-Z]*0*//g' file
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
enyaitl3

enyaitl33#

这可能对您有用(GNU sed):

sed -E 's/\|/&\n/4;h;s/\n.*//;s/(\|?)[^0-9]+0+/\1/g;G;s/\n.*\n//' file

插入一个换行符作为前四个字段的分隔符,并在保留空间中复制一份。
删除当前行中除前四个字段以外的所有字段。
从其余每个字段中删除前导非数字和零。
使用换行符附加副本。
删除所有在未更改字段之前添加改进字段的换行符。
有几种选择:

sed -E 's/\|/\n/4g;s/^/\|/;s/(\|)[^0-9]*0*/\1/g;s/.//;y/\n/|/' file

sed 'y/|/\n/
     s#.*#bash -c "sed -E '\''1,4{s/[^0-9]//g;s/^0+//}'\'' <<<$'\''&'\''"#e
     y/\n/|/' file

相关问题