삽입된 쉼표가 포함된 열 값을 기반으로 CSV 파일에서 행을 선택합니다.

삽입된 쉼표가 포함된 열 값을 기반으로 CSV 파일에서 행을 선택합니다.

4개의 열 이 있는 CSV 파일이 있습니다 Date.UserEmailComment

too much, later열의 행을 필터링 Comment한 다음 이를 새 파일로 읽으려면 어떻게 해야 합니까 input1.csv?

내가 시도한 내용은 다음과 같습니다. input1.csv결과는 비어 있습니다.

awk -F , '$4 == "too much, later" { print }' input.csv > input1.csv

다음은 샘플 입력입니다.

Date,User,Email,Comment
11/22/16,aaaa,[email protected],too much,later 

답변1

할 수는 있지만 awk어색합니다. :) 실제 CSV 파서를 사용하는 것이 더 좋습니다.csvkit:

csvgrep -c Comment -m 'too much, later' file.csv

답변2

CSV가 올바른 형식이라고 가정합니다.

Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"

작동합니다.csvkit:

$ csvgrep -c Comment -m 'too much, later' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"

$ csvgrep -c 4 -m 'too much, later' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"

또는 다음을 사용합니다 sed(마지막 열에 있다는 것을 알고 있으므로).

$ sed -n -e '1p' -e '/too much, later"$/p' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"

데이터는 질문에 표시된 대로입니다.

$ sed -n -e '1p' -e '/too much,later$/p' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],too much,later 

답변3

간단한 문제가 있습니다. 문자열에 (쉼표) too much, later가 포함되어 있고 ,필드 구분 기호도 포함되어 있으므로 ,$4 매개변수 too much는 $5 가 됩니다 later.

코드를 다음과 같이 변경할 수 있습니다.

awk -F , '$4 == "too much" && $5 == "later " { print }' input.csv > input1.csv

이 솔루션은 마지막 필드가 정확히 올바른 경우에만 작동합니다 too much,later(문자열의 후행 공백에 유의).

정규식 기반 솔루션은 더욱 강력합니다.

awk -F , '/,\s*too\s+much,\s*later\s*/{ print }' input.csv > input1.csv

이 솔루션에서는 문자열에 공백 문자를 얼마든지 포함할 수 있습니다.

답변4

awk -F"," 'NF>4 { 
    b=$0; $1=$2=$3=""
    if (match($0,/too much, ?later/)) 
        print b
}' OFS="," input.csv > input1.csv

관련 정보