필드에 구분 기호가 포함된 경우 열을 구분하는 방법

필드에 구분 기호가 포함된 경우 열을 구분하는 방법

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

귀하의 요구 사항이

  1. 예제에서 볼 수 있듯이 모든 데이터는 큰따옴표로 묶여 있습니다.
  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

관련 정보