平面文件的格式:
;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.命令)開頭的行
簡而言之:它會列印出由;----------;
和 分隔的第一個區塊(空白行或不以 開頭的行;
)。