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