フラットファイルの形式:
;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 スクリプトは、1 行に 1 つの条件を記述してフォーマットすると、はるかに理解しやすくなります。
'/^;-----------;/ {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
ヒントGoogle経由)。
答え3
スクリプトは、;----------;
(1. コマンド) で始まる行に到達するまで、すべての行 (2. コマンド) をスキップします。次に、余分なスペースを削除しながら (4. コマンド) 以降の行を出力し、空行または;
(3. コマンド)で始まっていない行に到達するまで続けます。
つまり、;----------;
と (空行または で始まっていない行;
)で区切られた最初のブロックを出力します。