![了解 AWK 脚本](https://linux22.com/image/36436/%E4%BA%86%E8%A7%A3%20AWK%20%E8%84%9A%E6%9C%AC.png)
平面文件的格式:
;metier_code ;
;-------------------------;
(0 rows affected)
;CRDS_Ptf_No; ; ; ; ; ; ; ; ; ; ; ; ; ; ;Status;
;-----------;----------;--------------------------------;-------------------------;----------;--------------------------------;-;-------------------------;-------------------------;---------------;---------------;---------------;-------------------------;-------------------------;-----;------;
; NULL;ABCD ;ABHJARS ; ;ABCD ;ABCD ;Y; ; ; ; ; ; ; ; ;A ;
; 1234;XEU-ANKD ;XEU-AJKD ; ;ABCD ;ABCD ;Y; ; ; ; ; ; ; ; ;A ;
.
.
; 11745;ANJLDMAOKD;AMKDJ AN DJ JAHF AS CPFVH ACCR ;NONE ;AN DJ JAHA;AN DJ JAHA ;Y;NO ANKIO GAP ;YES AMK SCF ; ; ; ; ; ; ;I ;
; 11744;AMKDIONSKH;AMKDJ AN DJ JAHF AS CPFVH MTM ;NONE ;AN DJ JAHA;AN DJ JAHA ;Y;NO ANKIO GAP ;YES AMK SCF ; ; ; ; ; ; ;I ;
(5436 rows affected)
(return status = 0)
Return parameters:
; ;
;-----------;
; 5436;
(1 row affected)
; ; ;
;-------;-----------;
;grepkey; 5436;
(1 row affected)
下面的脚本用于格式化平面文件。
awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > test
以下是我使用上述脚本得到的正确输出。
1;NULL;ABCD;ABHJARS;;ABCD;ABCD;Y;;;;;;;;;A;
2;NULL;XEU-ANKD;XEU-AJKD;;ABCD;ABCD;Y;;;;;;;;;A;
3;NULL;SWAPOLEIL;SWAPOLEIL;;QWERDF;QWERDF;Y;;;;;;;;;A;
.
.
5436;11744;AMKDIONSKH;AMKDJ AN DJ JAHF AS CPFVH MTM;;QWERDF;QWERDF;Y;;;;;;;;;A;
任何人都可以解释一下下面的 AWK 脚本,它用于格式化文件
awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > test
我从上面的脚本中理解了一些事情:1) /^[^;]|^$/ { exit;};如果出现不以 ; 开头的行,则停止处理2)它忽略了引导线
答案1
如果您使用每行一个条件来格式化 awk 脚本,那么它们会更容易理解:
'/^;-----------;/ {start=1;next;};
在读取以“;----------;”开头的行时,将变量 start 设置为 true,然后转到下一行输入而不打印任何内容。
start==0 {next;};
如果 start 为 false,则转到下一行输入而不打印任何内容。
/^[^;]|^$/ { exit;};
如果读入以非 或 为空的字符开头的行;
,则停止处理文件并退出(更简单的等效方法是!/^;/{exit}
)
{ line_nr++; gsub(" +",""); print line_nr "" $0;}
对于所有其他行,递增计数器,删除该行中的所有空格,然后打印计数器和更新的行。
答案2
似乎awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > test
是nl -w 1 -p -s';' temp_file > test
(暗示通过谷歌)。
答案3
该脚本会跳过所有行 (2.command),直到到达以;----------;
(1.command) 开头的行。然后,它打印以下行,删除无关的空格(4.命令),直到到达空行或不以;
(3.命令)开头的行
简而言之:它打印出由;----------;
和 分隔的第一个块(空行或不以 开头的行;
)。