AWK-Skript verstehen

AWK-Skript verstehen

Format der Flachdatei:

;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)

Das folgende Skript wird zum Formatieren der Flatfile verwendet.

awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > test

Unten ist die korrekte Ausgabe, die ich durch die Verwendung des obigen Skripts erhalte.

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;

KANN MIR BITTE JEMAND DAS UNTENSTEHENDE AWK-SKRIPT ERKLÄREN, das zum Formatieren der Datei verwendet wird

awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > test

ich konnte einige Dinge aus dem obigen Skript verstehen: 1) /^[^;]|^$/ { exit;}; stoppt die Verarbeitung, wenn eine Zeile auftritt, die nicht mit beginnt; 2) es ignoriert die führenden Zeilen

Antwort1

Awk-Skripte sind viel einfacher zu verstehen, wenn Sie sie mit einer Bedingung pro Zeile formatieren:

'/^;-----------;/ {start=1;next;};

Wenn Sie eine Zeile lesen, die mit „;----------;“ beginnt, setzen Sie die Variable „start“ auf „true“ und gehen Sie dann zur nächsten Eingabezeile, ohne etwas auszudrucken.

start==0 {next;};

Wenn „Start“ falsch ist, gehen Sie zur nächsten Eingabezeile, ohne etwas auszudrucken.

/^[^;]|^$/ { exit;};

Wenn eine Zeile ;eingelesen wird, die mit einem anderen Zeichen als beginnt oder leer ist, stoppen Sie die Verarbeitung der Datei und beenden Sie das Programm (ein einfacheres Äquivalent wäre !/^;/{exit}).

{ line_nr++; gsub(" +",""); print line_nr "" $0;}

Erhöhen Sie für alle anderen Zeilen einen Zähler, löschen Sie alle Leerzeichen aus der Zeile und drucken Sie dann den Zähler und die aktualisierte Zeile.

Antwort2

Scheint awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > testeine komplizierte Version von nl -w 1 -p -s';' temp_file > test( zu sein.Hinweisüber Google).

Antwort3

Das Skript überspringt alle Zeilen (2. Befehl), bis es zu einer Zeile kommt, die mit ;----------;(1. Befehl) beginnt. Dann druckt es die folgenden Zeilen und entfernt dabei überflüssige Leerzeichen (4. Befehl), bis es entweder eine leere Zeile oder eine Zeile erreicht, die nicht mit ;(3. Befehl) beginnt.

Kurz gesagt: Es druckt den ersten Block aus, der durch ;----------;und getrennt ist (leere Zeile oder Zeile, die nicht mit beginnt ;).

verwandte Informationen