Формат плоского файла:
;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. команда)
Короче говоря: он выводит первый блок, который разделен символами ;----------;
и (пустая строка или строка, не начинающаяся с ;
).