소스 파일에는 쉼표로 구분된 필드와 파이프로 구분된 필드가 포함되어 있습니다. 또한 쉼표와 파이프로 구분된 중복 헤더 레코드도 포함되어 있습니다.
** 소스 파일**
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
파이프로 구분된 헤더 하나와 파이프로 구분된 모든 레코드를 유지하고 싶습니다.
다음을 무시하십시오.
쉼표로 구분된 모든 필드 기록 및 제목
파이프로 구분된 헤더가 중복되었습니다.
가설
파이프 구분 기호 헤더의 첫 번째 필드 = FOOID
파이프로 구분된 필드에는 쉼표가 포함될 수 있습니다.
이 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