24개 필드가 있는 CSV 파일이 있습니다. 레코드는 아래 예와 같습니다. 따라서 일부 필드에는 값에 ","가 있습니다. 구분 기호를 사용하는 방법은 무엇입니까?
9열에서 200보다 큰 값을 찾으려고 합니다. 그러나 구분 기호 문제로 인해 처음 몇 열의 텍스트가 표시됩니다.
"86680728811_10150499874478812","86680728811","fun ,celebrators.","New York City’s buildings, descend on Times Square when the iconic ball drops tomorrow...","abcnews.go.com","link","published_story","271","31","0","0","0","0","0","0","0","http://abcnews.go.com/blogs/headlines/2011/12/wishes-for-2012-to-fall-on-times-square/","https://external.xx.fbcdn.net/safe_image.php?d=AQAbTSWm1WlXInTf&w=130&h=130","2012-01-01 02:00:37"
이 문제를 어떻게 해결할 수 있나요?
답변1
CSV를 구문 분석하는 방법을 아는 도구를 사용할 수 있습니다. 밀러를 예로 들어보겠습니다.
mlr -N --csv filter '$9 > 200' < your-file
GNU를 사용하면 필드를 구분하는 구분 기호 대신 일치하는 패턴을 기반으로 정의되도록 필드를 awk
설정할 수 있습니다 .FPAT
gawk -v 'FPAT=[^",]*|"([^"]|"")*"' 'substr($9,2) > 200'
여기에서도 이스케이프가 처리되지만 "
필드 ""
값에 줄바꿈이 포함되지 않고 9번째 필드가 항상 따옴표로 묶여 있다고 가정합니다.
답변2
귀하의 요구 사항이
- 예제에서 볼 수 있듯이 모든 데이터는 큰따옴표로 묶여 있습니다.
- 첫 번째 및 마지막 필드에 관심이 없거나 이를 처리하기 위해 추가 작업을 수행할 준비가 되어 있습니다.
그러면 구분 기호를 일련의 세 문자로 생각할 수 있습니다 ","
.
awk -F '","' '$9>200 {print}' file.csv
(이것은 {print}
필수가 아니며, 추가 코드를 추가할 위치를 명확하게 표시하기 위해 넣었습니다.)
편집: 9번째 열이 200을 초과할 때 동일한 형식으로 3개 열을 인쇄하는 확장된 예입니다.
awk -F '","' 'BEGIN {OFS=FS}$9>200{print "\""$3,$8,$9"\""}'
구분 기호를 로 변경 |
하고 숫자순으로 정렬합니다.
awk -F '","' 'BEGIN {OFS="|"}$9>200{print $3,$8,$9}' | sort -d'|'-n -k3