Я выгрузил данные таблицы базы данных в плоский файл, и вот как они выглядят: (Пожалуйста, скопируйте снизу)
;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)
хотите преобразовать вышеуказанный формат в следующий:
Строка должна содержать последовательность no (префикс). Необходимо удалить имена столбцов и пробелы, присутствующие в исходном файле в начале и конце.
НИЖЕ ПРИВЕДЕН ФОРМАТ ДАННЫХ, КОТОРЫЕ Я ПОЛУЧАЮ, ИСПОЛЬЗУЯ ПРЕДЛОЖЕННЫЙ КОД:
awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; {gsub(" +",""); print NR "" $0;}' temp_file > test
ФОРМАТ после выполнения приведенного выше скрипта:
7;NULL;ABCD;ABHJARS;;ABCD;ABCD;Y;;;;;;;;;A;
8;NULL;XEU-ANKD;XEU-AJKD;;ABCD;ABCD;Y;;;;;;;;;A;
.
.
5443;11744;AMKDIONSKH;AMKDJ AN DJ JAHF AS CPFVH MTM;;QWERDF;QWERDF;Y;;;;;;;;;A;
5444
5445(5436rowsaffected)
5446(returnstatus=0)
5447
5448Returnparameters:
5449
5450;;
5452;5436;
5453
5454
5455(1rowaffected)
5456;;;
5457;-------;-----------;
5458;grepkey;5436;
5459
5460(1rowaffected)
Выше: номер строки префикса не идет последовательно (увеличение с использованием предыдущих строк, которые не являются фактическими данными). Исходный файл содержал дополнительную информацию в плоском файле, такую как имя столбца @ beginning, в конце файла несколько дополнительных деталей, которые мне были нужны, например, количество записей и т. д.
Мне нужны данные в следующем формате (который должен иметь префиксный номер строки и должен включать только строки таблицы, а не дополнительные предшествующие и превосходящие данные)
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;
5436 - is the number of rows present in the table from where i am fetching the data.
решение1
awk -F ' *; *' \
'{printf "%d;",NR; for(i=2;i<=NF;i++) printf "%s;",$i; print "";}' file
-F
устанавливает разделитель полей в регулярном выражении *; *
(т.е. «точка с запятой с любым количеством (включая ноль) пробелов с обеих сторон»).
Или проще:
awk -F ' *; *' -v OFS=";" '{$1=NR; $(NF+1)=""; NF--; print}' file
$(NF+1)=""; NF--;
просто принудительно выполняет пересчет, $0
но теперь с измененным OFS
разделителем полей.
Еще проще:
awk -F ';' '{gsub(" +",""); print NR "" $0;}' file
Если awk
следует «обработать» (т.е. проигнорировать) также и ведущие строки:
awk -F ';' '/^;-----------;/ {start=1;next;};
start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' file
редактировать
Я не обратил достаточного внимания и забыл адаптировать номер строки в последнем примере. Поскольку прочитанные строки больше не совпадают с написанными (обычными), NR больше не может использоваться.
правка 2
Добавление /^[^;]|^$/ { exit;};
останавливает обработку, если встречается строка, которая не начинается с ;
.
решение2
Используя sed
иawk
sed -e '/^; *NULL/ s/ *//g' file | sed -n '/^;NULL.*/,$p' | awk '{print NR$0}'
sed -e '/^; *NULL/ s/ *//g' file
- Удаляет пробелы в строках, начинающихся с; NLL
.sed -n '/^;NULL.*/,$p'
- Удаляет все строки перед строкой, начинающейся с; NULL
.awk '{print NR$0}'
- печатает все строки, которым предшествует значение NR.
решение3
Я думаю, что даже sed
и awk
здесь может быть немного перебором.
grep '^;.*NULL' <<\DATA | tr -d '[:blank:]' | grep -n .
;metier_code ;
;-------------------------;
(0 rows affected)
;CRDS_Ptf_No; ; ; ; ;
; ; ; ; ; ;
; ; ; ;Status;
;-----------;----------;--------------------------------;-------------------------;----------;--------------------------------;-;-------------------------;-------------------------;---------------;---------------;---------------;-------------------------;-------------------------;-----;------;
; NULL;ABCD ;ABCD ; ;ABCS ;ABCS
;Y; ; ; ; ;
; ; ; ;A ;
; NULL;PKG-ABCP ;UEX-SWAP ; ;ABCS ;ABCS
;Y; ; ; ; ;
; ; ; ;A ;
; NULL;SWAPOLEIL ;SWAPOLEIL ; ;QWERDF ;QWERDF
;Y; ; ; ; ;
; ; ; ;A ;
DATA
ВЫХОД
1:;NULL;ABCD;ABCD;;ABCS;ABCS;Y;;;;;;;;;A;
2:;NULL;PKG-ABCP;UEX-SWAP;;ABCS;ABCS;Y;;;;;;;;;A;
3:;NULL;SWAPOLEIL;SWAPOLEIL;;QWERDF;QWERDF;Y;;;;;;;;;A;