可能的重复:
有没有强大的命令行工具来处理 csv 文件?
我可以用来cut
从文件中提取列:
$ cat foo
foo,bar,hello
bash,baz,world
$ cut -d\, -f2 foo
bar
baz
但是,如果列中有一个分隔符并且在这样的外壳内是安全的怎么办?
$ cat foo
foo,"hello, world",bar
bash,goodbye,baz
$ cut -d\, -f2 temp12
"hello
goodbye
有什么方法可以告诉我们尊重引号字符cut
的包围吗?""
答案1
绝对不适合 GNU 剪切,至少:
/* The delimeter character for field mode. */ static unsigned char delim;
(如 GNU coreutils 源代码所示)
答案2
cut
如果您首先预处理其输入以转义引号内的字符(例如,将引号内的“_”替换为“_u”,将“,”替换为“_c”,或者将每个字符替换为其 2 字节十六进制表示法,则可以做到这一点)并对它进行后处理以恢复转义。
就像是:
perl -pe 's/"(.*?)"/"\"".unpack("H*", $1)."\""/ge' |
cut -d, -f2 |
perl -pe 's/"(.*?)"/"\"".pack("H*",$1)."\""/ge'
(假设引号内(或外)没有转义引号)。
但是,考虑到它需要付出的努力,您最好使用适当的 csv 解析器或使用类似 perl 的正则表达式引擎来完成整个工作。