데이터베이스 테이블 데이터를 플랫 파일에 덤프했으며 데이터는 다음과 같습니다. (아래에서 복사하세요.
;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;}; {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)
위: 접두사 행 번호가 순차적으로 표시되지 않습니다(실제 데이터가 아닌 이전 행을 사용하여 증가). 초기 파일에는 @로 시작하는 열 이름과 같은 플랫 파일의 추가 정보가 포함되어 있으며 파일 끝에는 레코드 수 등과 같은 추가 세부 정보가 있습니다.
다음 형식의 데이터를 원합니다(행 번호 앞에 접두사가 있어야 하고 추가 데이터 없이 테이블의 행만 포함해야 함).
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
정규식의 필드 구분 기호 *; *
(예: "임의의 공백(0 제외) 옆에 있는 세미콜론")을 설정합니다.
또는 더 간단하게:
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;