提问人:Abou Ilyès 提问时间:11/18/2023 更新时间:11/18/2023 访问量:64
Awk : 另一种更优雅的方式 ?看到里面了吗?
Awk : an other way more elegant to do it ? See inside?
问:
我写了一个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 不应该更清楚吗?:-)
谢谢你的帮助
阿布·伊利斯
答:
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|||||
评论