매개변수가 다른 행과 열이 포함된 거대한 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>
sort
gawk 내부에서 및 명령 과 동일한 작업을 수행할 수 있지만 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를 효율적으로 구문 분석하는 가장 강력한 방법은 무엇입니까더 많은 정보를 알고 싶습니다.