4개의 열 이 있는 CSV 파일이 있습니다 Date
.User
Email
Comment
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