첫 번째 행이 패턴과 일치하는 경우에만 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에 "무엇이든"이 없으면 처리할 다음 파일로 건너뛰어야 합니다.

nextfileGNU awk 확장인지 아니면 다른 awk에서도 사용할 수 있는지 기억이 나지 않습니다 . 매뉴얼 mawk페이지에는 언급되어 있지 않지만 의 매뉴얼 페이지에는 언급되어 있습니다 original-awk. 중요한 경우 해당 기능을 사용하기 전에 먼저 확인하세요.

GNU awk를 사용하는 경우 해당 테스트를 다음과 같은 블록에 넣을 수 있습니다 BEGINFILE.

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

관련 정보