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"