挿入されたコンマを含む列値に基づいてCSVファイルから行を選択します。

挿入されたコンマを含む列値に基づいてCSVファイルから行を選択します。

4つの列を含むCSVファイルがありますDateUserEmailComment

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

関連情報