AWK スクリプトの理解

AWK スクリプトの理解

フラットファイルの形式:

;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. コマンド)で始まっていない行に到達するまで続けます。

つまり、;----------;と (空行または で始まっていない行;)で区切られた最初のブロックを出力します。

関連情報