덤프된 데이터베이스 테이블에서 공백 및 헤더 제거

덤프된 데이터베이스 테이블에서 공백 및 헤더 제거

데이터베이스 테이블 데이터를 플랫 파일에 덤프했으며 아래는 데이터가 어떻게 보이는지입니다. (아래에서 친절하게 복사하십시오.

;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

위 스크립트를 실행한 후 FORMAT:

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)

위 : 접두사 행 번호가 순서대로 나오지 않습니다(실제 데이터가 아닌 앞선 행을 사용하여 증가). 초기 파일에는 열 이름 @begin과 같은 플랫 파일의 추가 정보가 포함되어 있었고, 파일 끝에는 레코드 수 등과 같이 내가 원했던 몇 가지 추가 세부 정보가 있었습니다.

아래 형식의 데이터를 원합니다(접두사 행 번호가 있어야 하며 추가 선행 및 초과 데이터가 아닌 테이블의 행만 포함해야 함).

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

사용 sedawk

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;

관련 정보