첫 번째 줄이 패턴과 일치하는 경우에만 Awk를 사용하여 파일을 구문 분석합니다.

첫 번째 줄이 패턴과 일치하는 경우에만 Awk를 사용하여 파일을 구문 분석합니다.

헤더에 대한 CSV 파일을 요청해야 하며 열이 존재하면 데이터 행을 계속 진행해야 합니다. 컨텍스트는 열을 포함하는 데이터를 참조합니다(내보낸 시기와 대상에 따라 다름).

공통 언어로 비즈니스 로직을 유지하기 위한 "순수한" Awk 솔루션을 갖고 싶지만, 그것이 가능하지 않다면 헤더가 Awk 스크립트와 일치하는 파일을 선택적으로 전달하는 방법에 관심이 있을 것입니다.

최신 버전의 Gawk를 사용하는 것은 항상 선택 사항입니다.

의사 코드를 추가하도록 편집되었습니다.

헤더의 열(NR==1)인 경우: 파일의 나머지 부분을 계속 처리하고, 그렇지 않으면 파일 처리를 중지합니다.

답변1

파일 나열:

노력하다

awk 'FNR == 1 && $4 == "whatever" { print FILENAME ;}' file1 ... filen |

그러면 네 번째 열에 있는 모든 항목이 포함된 모든 파일이 선택됩니다.

재미있는 이름이 있으면 따옴표를 추가하세요.

awk 'FNR == 1 && $4 == "whatever" { printf "\"s\"\n", FILENAME ;}' file1 ... filen |

파일을 처리하다

awk 'NR == 1 && $4 != "whatever" { exit ;}  other patterns { other action;}' file

많은 파일 처리

awk 'NR == 1 && $4 != "whatever" { nextfile ;}  other patterns { other action;}' file1 ... filen

로 이해될 수 있다

  • IF(조건이 충족되지 않음)NR == 1 && $4 != "whatever"
  • 그럼 이 파일을 건너뛰세요{ nextfile ;}
  • 그렇지 않으면 계속other patterns { other action;}

답변2

각 쉼표가 구분 기호인 간단한 쉼표로 구분된 파일을 가정하면(일부 csv 파일은 필드 구분 기호로 간주되지 않는 쉼표를 인용할 수 있음) 헤더의 열이 "SOMESTRING"이면 다음은 헤더를 제외한 모든 줄을 인쇄합니다.

awk -F, '
    FNR==1 {
        for (i=1; i<=NF; i++) 
            if ($i == "SOMESTRING")
                next
        nextfile
    }
    1
' file1 file2 file3 file4

해당하는 경우 문자열 비교를 하위 문자열 테스트 또는 정규식 일치 작업으로 바꿀 수 있습니다.

nextfile은 POSIX AWK의 일부는 아니지만 최소한 gawk, nawk(*BSD 시스템에서 사용됨), mawk 및 busybox에서 사용할 수 있습니다.

답변3

awk 'FNR==1 && ! /whatever/ { nextfile } ; ...remainder of awk script here...' list_of_files_to_process

라인 1에 "무엇이든"이 없으면 처리할 다음 파일로 이동해야 합니다.

nextfile그것이 GNU awk 확장인지 아니면 다른 awk에서도 사용할 수 있는지 기억이 나지 않습니다 . 매뉴얼 mawk페이지에는 언급되어 있지 않지만 original-awk이것이 중요하다면 해당 기능을 사용하기 전에 확인해 보십시오.

BEGINFILEGNU awk를 사용하는 경우 다음과 같이 이 테스트를 블록에 넣을 수 있습니다 .

 BEGINFILE { FNR==1 && ! /whatever/ { nextfile } } ;
 ... remainder of awk script here ...

관련 정보