フラットファイル形式:
;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
1行に1つの条件で書式を設定すると、Awkスクリプトを理解しやすくなります。
'/^;-----------;/ {start=1;next;};
";------------;"で始まる行を読み取るとき、変数startをtrueに設定した後、何も印刷せずに入力の次の行に移動します。
start==0 {next;};
start が false の場合、何も印刷せずに次の入力行に移動します。
/^[^;]|^$/ { exit;};
または null 以外の文字で始まる行を で読み取ると;
ファイル処理を停止して終了します (もっと簡単な方法は!/^;/{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
(ヒントGoogle経由)。
答え3
スクリプトは、;----------;
(1.command)で始まる行に達するまで、すべての行(2.command)をスキップします。次に、空の行または;
(3.command)で始まらない行に達するまで、不要なスペース(4.command)を削除して次の行を印刷します。
;----------;
つまり、およびで区切られた最初のブロック(空白行またはで始まらない行;
)を印刷します。