정렬을 사용하여 열을 선택하고 쉼표 구분 기호 ','를 사용하여 csv를 잘라내고 쉼표 "text,text"가 포함된 따옴표 안의 데이터를 무시합니다.

정렬을 사용하여 열을 선택하고 쉼표 구분 기호 ','를 사용하여 csv를 잘라내고 쉼표 "text,text"가 포함된 따옴표 안의 데이터를 무시합니다.

매개변수가 다른 행과 열이 포함된 거대한 csv 파일을 구문 분석하고 있습니다. 그러나 일부 필드에는 쉼표가 포함된 따옴표 안에 광범위한 설명이 포함되어 있습니다. 따옴표 안의 쉼표를 무시하고 열 정렬 및 잘라내기를 선택하는 방법은 무엇입니까? quote-comma-quote를 구분 기호로 추가하려고 시도했지만 오류(잘못된 인수)가 발생하거나 백슬래시로 따옴표를 이스케이프 처리했지만 오류도 발생했습니다.

sort  -k12 -t'","' file

또는

cut -f 12 -d '","' file

파일의 줄 예:

"GFYZ01001952.1",99.606,"ASTG2327","PREDICTED: kinesin-like protein NACK1 [Elaeis guineensis]","--","centromeric protein E","Kinesin-like protein NACK1 OS=Arabidopsis thaliana GN=NACK1 PE=1 SV=1","Baculovirus polyhedron envelope protein, PEP, C terminus//Autophagy protein Apg6//Basic region leucine zipper//Protein of unknown function (DUF904)",0.005,3.2,3.5,0.00006

답변1

CSV는 구조화된 문서 형식입니다. 따라서 간단한 텍스트 조작 도구 cut( 데이터가 단순하지 않은 경우 또는 , 또는 )는 CSV 파일을 안전하고 편리하게 처리하는 데 충분하지 않습니다(필드에 구분 기호 및 줄바꿈이 포함될 수 있음 sort) sed. awk대신 CSV를 지원하는 처리 도구를 사용하는 것이 좋습니다.밀러( mlr).

다음 Miller 명령은 파일을 헤더 없는 CSV 파일로 구문 분석하고 12번째 필드를 기준으로 숫자 오름차순으로 정렬합니다.

mlr --csv -N sort -n 12 file

CSV 데이터에 헤더가 있는 경우 해당 -N옵션을 제거하고 대신 헤더 이름을 사용하세요 12.

mlr --cvs sort -n pvalue file

열 12를 추출하려면,

mlr --csv -N cut -f 12 file

종류그리고무슨 일이 있어도 우리는 처음 10개의 결과만 얻습니다.

mlr --csv -N sort -n 12 then cut -f 12 then head -n 10 file

-N다시 말하지만, 입력에 헤더가 있으면 이를 제거하고 대신 필드 이름을 사용하십시오.


와 함께csvkitcsvsort다음과 같은 결과를 얻는 데 사용할 수 있는 툴킷 :

csvsort -H -c 12 file | tail -n +2

(이 tail명령은 생성된 헤더를 제거합니다 csvsort) 또는 입력의 헤더를 사용하여

csvsort -c pvalue file

개별 필드를 추출하려면 다음 명령을 사용하십시오 csvcut.

csvcut -H -c 12 file

결합하다 csvsort:

csvsort -H -c 12 file | csvcut -c 12 | head -n +2

아니면 제목을 사용해서,

csvsort -c pvalue file | csvcut -c pvalue

명령이 없으므로 csvhead결과는 를 통해 다른 방법으로 10개의 레코드로 제한되어야 합니다 mlr --csv head -n 10.

답변2

필드는 GNU awk를 사용하여 식별할 수 있습니다 FPAT.

$ awk -v FPAT='[^,]*|("([^"]|"")*")' '{for (i=1; i<=NF;i++) print i " <" $i ">"}' file
1 <"GFYZ01001952.1">
2 <99.606>
3 <"ASTG2327">
4 <"PREDICTED: kinesin-like protein NACK1 [Elaeis guineensis]">
5 <"--">
6 <"centromeric protein E">
7 <"Kinesin-like protein NACK1 OS=Arabidopsis thaliana GN=NACK1 PE=1 SV=1">
8 <"Baculovirus polyhedron envelope protein, PEP, C terminus//Autophagy protein Apg6//Basic region leucine zipper//Protein of unknown function (DUF904)">
9 <0.005>
10 <3.2>
11 <3.5>
12 <0.00006>

sortgawk 내부에서 및 명령 과 동일한 작업을 수행할 수 있지만 cut실제로 이러한 외부 명령을 사용하려는 경우 awk를 사용하여 ;-구분된 \n-종료 레코드를 \n-구분된 NUL-종료 레코드로 변환한 다음 파이프할 수 있습니다. NUL 종료 입력을 처리할 수 있는 도구로 변환한 다음 필요한 경우 다시 변환합니다(예: GNU awk, 잘라내기 및 정렬).

$ awk -v FPAT='[^,]*|("([^"]|"")*")' -v OFS='\n' -v ORS='\0' '{$1=$1} 1' file |
    cut -z -f 12 -d $'\n'
0.00006$

$ awk -v FPAT='[^,]*|("([^"]|"")*")' -v OFS='\n' -v ORS='\0' '{$1=$1} 1' file |
    sort -z -k 12 -t $'\n' |
    awk -v RS='\0' -v ORS='\n' -F '\n' -v OFS=';' '{$1=$1} 1'
"GFYZ01001952.1";99.606;"ASTG2327";"PREDICTED: kinesin-like protein NACK1 [Elaeis guineensis]";"--";"centromeric protein E";"Kinesin-like protein NACK1 OS=Arabidopsis thaliana GN=NACK1 PE=1 SV=1";"Baculovirus polyhedron envelope protein, PEP, C terminus//Autophagy protein Apg6//Basic region leucine zipper//Protein of unknown function (DUF904)";0.005;3.2;3.5;0.00006

바라보다awk를 사용하여 csv를 효율적으로 구문 분석하는 가장 강력한 방법은 무엇입니까더 많은 정보를 알고 싶습니다.

관련 정보