단일 파일에서 여러 유형의 필드 구분 기호 처리

단일 파일에서 여러 유형의 필드 구분 기호 처리

소스 파일에는 쉼표로 구분된 필드와 파이프로 구분된 필드가 포함되어 있습니다. 또한 쉼표와 파이프로 구분된 중복 헤더 레코드도 포함되어 있습니다.

** 소스 파일**

FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
FOOID|BIZNO|BARBIZ_CODE
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
FOOID|BIZNO|BARBIZ_CODE
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP
FOOID,BIZNO,BARBIZ_CODE
A0021826,Q022008,Z5,TRASH
B0021826,R022009,Z5,TRASH
C0021826,S022018,Z5,TRASH
FOOID,BIZNO,BARBIZ_CODE

파이프로 구분된 헤더 하나와 파이프로 구분된 모든 레코드를 유지하고 싶습니다.

다음을 무시하십시오.

  1. 쉼표로 구분된 모든 필드 기록 및 제목

  2. 파이프로 구분된 헤더가 중복되었습니다.

가설

  1. 파이프 구분 기호 헤더의 첫 번째 필드 = FOOID

  2. 파이프로 구분된 필드에는 쉼표가 포함될 수 있습니다.

이 awk 스크립트는 내 파일에서 중복된 파이프 헤더를 제거합니다. 모든 CSV 레코드를 무시하도록 하려면 어떻게 해야 합니까?

#!/usr/bin/awk -f
BEGIN{ FS="|"
      header_f1 = "FOOID" }
{
if (NR==1) { print $0 }
if (NR>1 && $1 != header_f1 && length > 1) { print $0 }
}

원하는 결과

FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP

답변1

귀하의 입력 예를 고려하면 다음과 같이 작동하는 것 같습니다.

$ awk 'NR == 1 { print } /,/ && /\|/ { print }' input
FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP

항상 첫 번째(제목) 레코드를 인쇄합니다. 그 이후에는 쉼표와 세로 막대가 있는 레코드만 인쇄됩니다.

답변2

짧은방법:

awk -F'|' 'NR==1{ h=$1; print }NF>1 && NR>1 && $0!~"^"h' file
  • -F'|'- |필드 구분자로 처리됩니다.
  • NR==1{ h=$1; print }- 첫 번째 레코드가 발견되면 첫 번째 헤더 필드를 $1변수에 할당합니다 h(헤더 라인에 표시된 대로).
  • NF>1- 최소 2개의 " |" 구분 필드가 있는 레코드를 인쇄합니다.
  • $0!~"^"h- 기록이 존재하지 않는지 추가 확인관련된제목줄에

산출:

FOOID|BIZNO|BARBIZ_CODE
00033567|0035952|A,KEEP
00034145|0036865|A,KEEP
00030527|0032479|Z4,KEEP
00034984|0037987|Z5,KEEP
00021826|0022008|Z5,KEEP
00026763|0029293|Z5,KEEP

관련 정보