CSVファイルがあるとしましょう。
"col1","col2","col3"
"col4","col5,subtext","col6
私が経験した問題は次のとおりです。
cut -d, -f1,2 test.txt
"coll1","col2"
"col4","col5
希望の出力は次のとおりです。
"col1","col2"
"col4","col5,subtext"
答え1
Perlに付属のParseWordsモジュールは、それを非常にエレガントに扱います。以下の例
$ perl -MText::ParseWords -nE '@a=quotewords ",",1,$_;say $a[0],",",$a[1]' <test.txt
"col1","col2"
"col4","col5,subtext"
$
答え2
v4が利用可能な場合はgawk
良い解決策があります。awkを使用してcsvを解析し、フィールド内のコンマを無視します。
例:
gawk -vFPAT='[^,]*|"[^"]*"' '{print $1 "," $2}' test.txt
答え3
perl
すべてのフィールドが参照されると仮定する別のソリューション
$ perl -F'/"\K,(?=")/' -lane 'print "$F[0],$F[1]"' test.txt
"col1","col2"
"col4","col5,subtext"
-F'/"\K,(?=")/'
フィールド区切り記号は、前後に"
コンマがある場合にのみコンマです。"
print "$F[0],$F[1]"
最初の2つのフィールド、区切り記号を印刷,
grep
また利用できます
$ grep -oE '^"[^"]*","[^"]*"' test.txt
"col1","col2"
"col4","col5,subtext"
N個のフィールドが必要な場合は、内部grep -oE '^("[^"]*",){1}"[^"]*"'
番号を使用してください。{}
N-1
答え4
以下のようにawkで試してみることもできます。
awk -F'","' '{printf "%s\",\"%s\"\n", $1, $2 }' test.txt
例えば。
user@host$ awk -F'","' '{printf "%s\",\"%s\"\n", $1, $2 }' test.txt
"col1","col2"
"col4","col5,subtext"