Awk : 另一种更优雅的方式 ?看到里面了吗?

Awk : an other way more elegant to do it ? See inside?

提问人:Abou Ilyès 提问时间:11/18/2023 更新时间:11/18/2023 访问量:64

问:

我写了一个awk程序,它给了我我需要的结果。 查找以 130AB 开头的任何行:如果第 2 个字段包含数据,则将其移动到第 9 个字段

我的输入文件:

130DD2532||1|||1|
130AB00100501||20|17112023|17112023||N|||0||
130DD2532||1|||1|
130AB00100502||20|17112023|17112023||N|||0||
130DD2532||1|||1|
130AB00100112||20|17112023|17112023||N|||0||
130DD2532||1|||1|
130AB00100113|00100113|20|17112023|17112023||N|||0||

请参阅最后一行

我的程序文件 prog.awk

/^130AB/ { if ($2==""){print $1"|"$2"|"$3"|"$4"|"$5"|"$6"|"$7"|"$8"|"$9"|"$10"|"$11"|"$12"|"$13"|"$14"|"$15} else { print $1"|""|"$3"|"$4"|"$5"|"$6"|"$7"|"$8"|"$2"|"$10"|"$11"|"$12"|"$13"|"$14"|"$15}; next; }; 
{ print; }

我的命令行:

awk -F "|" -f prog.awk myFile.txt > newFile.txt

结果 : newFile.txt

130DD2532||1|||1|
130AB00100501||20|17112023|17112023||N|||0|||||
130DD2532||1|||1|
130AB00100502||20|17112023|17112023||N|||0|||||
130DD2532||1|||1|
130AB00100112||20|17112023|17112023||N|||0|||||
130DD2532||1|||1|
130AB00100113||20|17112023|17112023||N||00100113|0|||||

它工作正常,但我的 prog.awk 不应该更清楚吗?:-)

谢谢你的帮助

阿布·伊利斯

AWK 分离器

评论


答:

3赞 markp-fuso 11/18/2023 #1

当前代码的一种替代方法:

$ cat prog.awk
BEGIN    { FS=OFS="|" }                                 # define input/output field delimiters
/^130AB/ { if ($2 != "")            { $9=$2; $2="" }    # if 2nd field not blank then redefine 2nd/9th fields
           for (i=NF+1; i<=15; i++)   $i=""             # add additional blank fields until we have a total of 15 fields
         }
1                                                       # print current line

注意:我已将 移动到一个块中,因此这将更改命令行调用,例如:-F"|"BEGIN

$ awk -f prog.awk myFile.txt > newFile.txt

这将生成:

$ cat newFile.txt
130DD2532||1|||1|
130AB00100501||20|17112023|17112023||N|||0|||||
130DD2532||1|||1|
130AB00100502||20|17112023|17112023||N|||0|||||
130DD2532||1|||1|
130AB00100112||20|17112023|17112023||N|||0|||||
130DD2532||1|||1|
130AB00100113||20|17112023|17112023||N||00100113|0|||||
1赞 Ed Morton 11/18/2023 #2

你不需要测试是否被填充,因为它没有被填充,然后将空分配给空的值,不会改变任何事情。$2$9$2

这符合您在文本描述中的要求(将 2 美元移动到 9 美元):

$ awk 'BEGIN{FS=OFS="|"} /^130AB/{$9=$2; $2=""} 1' file
130DD2532||1|||1|
130AB00100501||20|17112023|17112023||N|||0||
130DD2532||1|||1|
130AB00100502||20|17112023|17112023||N|||0||
130DD2532||1|||1|
130AB00100112||20|17112023|17112023||N|||0||
130DD2532||1|||1|
130AB00100113||20|17112023|17112023||N||00100113|0||

虽然这会产生您显示的预期输出(将 2 美元移动到 9 美元,并将空字段添加到字段编号 15):

$ awk 'BEGIN{FS=OFS="|"} /^130AB/{$9=$2; $2=""; $15=$15} 1' file
130DD2532||1|||1|
130AB00100501||20|17112023|17112023||N|||0|||||
130DD2532||1|||1|
130AB00100502||20|17112023|17112023||N|||0|||||
130DD2532||1|||1|
130AB00100112||20|17112023|17112023||N|||0|||||
130DD2532||1|||1|
130AB00100113||20|17112023|17112023||N||00100113|0|||||