Понимание скрипта 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 гораздо проще понять, если отформатировать их так, чтобы на строку было по одному условию:

'/^;-----------;/ {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

Скрипт пропускает все строки (2. команда), пока не дойдет до строки, начинающейся с ;----------;(1. команда). Затем он печатает следующие строки, удаляя лишние пробелы (4. команда), пока не дойдет до пустой строки или строки, не начинающейся с ;(3. команда)

Короче говоря: он выводит первый блок, который разделен символами ;----------;и (пустая строка или строка, не начинающаяся с ;).

Связанный контент