필터를 기반으로 파일에 awk 출력

Oct 21 2020

CSV열 중 하나의 값에 따라 다른 조각으로 잘라야 하는 큰 파일이 있습니다. 내 입력 파일 dataset.csv은 다음과 같습니다.

참고 : 데이터에 ,data,공백 이 없음 을 명확히하기 위해 편집되었습니다 .

action,action_type, Result
up,1,stringA
down,1,strinB
left,2,stringC

따라서 분할하려면 action_type간단히 수행하십시오 (결과 파일에 전체 일치하는 줄이 필요합니다).

awk -F, '$2 ~ /^1$/ {print}' dataset.csv >> 1_dataset.csv
awk -F, '$2 ~ /^2$/ {print}' dataset.csv >> 2_dataset.csv

이것은 예상대로 작동하지만 기본적으로 원래 데이터 세트를 두 번 탐색하고 있습니다. 내 원래 데이터 세트는 약 5GB이고 30 개의 action_type카테고리가 있습니다. 매일이 작업을 수행해야하므로 자체적으로 효율적으로 실행되도록 스크립트를 작성해야합니다.

다음을 시도했지만 작동하지 않습니다.

# This is a file called myFilter.awk

{
action_type=$2; if (action_type=="1") print $0 >> 1_dataset.csv;
else if (action_type=="2") print $0 >> 2_dataset.csv;
}

그런 다음 다음과 같이 실행합니다.

awk -f myFilter.awk dataset.csv

그러나 나는 아무것도 얻지 못한다. 말 그대로 아무것도, 심지어 오류도 없습니다. 어떤 종류의 코드가 단순히 어떤 것과도 일치하지 않거나 내 인쇄 / 파이프 문이 잘못되었음을 알려줍니다.

답변

4 anubhava Oct 21 2020 at 04:16

이 awk를 단일 명령으로 수행 할 수 있습니다.

awk -F, 'NR > 1{fn = $2 "_dataset.csv"; print >> fn; close(fn)}' file
3 EdMorton Oct 21 2020 at 05:12

GNU awk를 사용하여 동시에 열린 많은 파일을 처리하고 각 출력 파일의 헤더 행을 복제하지 않습니다.

awk -F',' '{print > ($2 "_dataset.csv")}' dataset.csv

또는 헤더 행이 각 출력 파일에 표시되도록하려면 GNU awk를 사용하십시오.

awk -F',' '
    NR==1 { hdr = $0; next }
    !seen[$2]++ { print hdr > ($2 "_dataset.csv") }
    { print > ($2 "_dataset.csv") }
' dataset.csv

또는 모든 awk와 동일합니다.

awk -F',' '
    NR==1 { hdr = $0; next }
    { out = $2 "_dataset.csv" } !seen[$2]++ { print hdr > out }
    { print >> out; close(out) }
' dataset.csv
1 markp-fuso Oct 21 2020 at 04:23

현재 코딩 된대로 입력 필드 구분 기호가 정의되지 않았습니다.

흐름:

$ cat myfilter.awk { action_type=$2;
if (action_type=="1") print $0 >> 1_dataset.csv; else if (action_type=="2") print $0 >> 2_dataset.csv;
}

기도:

$ awk -f myfilter.awk dataset.csv

이 문제를 해결하는 몇 가지 방법이 있습니다.

$ awk -v FS="," -f myfilter.awk dataset.csv

또는

$ cat myfilter.awk BEGIN {FS=","} { action_type=$2
if (action_type=="1") print $0 >> 1_dataset.csv; else if (action_type=="2") print $0 >> 2_dataset.csv;
}

$ awk -f myfilter.awk dataset.csv