플랫 파일 형식:
;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
스크립트는 (1. command)로 시작하는 줄이 나올 때까지 모든 줄(2. command)을 건너뜁니다 ;----------;
. 그런 다음 빈 줄이나 시작하지 않는 줄 ;
(3. 명령) 에 도달할 때까지 불필요한 공백을 제거하여(4. 명령) 다음 줄을 인쇄합니다.
즉, ;----------;
and로 구분된 첫 번째 블록을 인쇄합니다(빈 줄 또는 로 시작하지 않는 줄 ;
).