我需要"提取" CSV文件中的某些列。要提取的列的列表很长,并且它们的索引不遵循常规模式。到目前为止,我已经提出了一个逗号分隔值的正则表达式,但我发现令人沮丧的是,在sed的替换命令的RHS方面,我不能引用超过9个保存的字符串。关于这个的任何想法?
请注意,必须引用包含逗号的逗号分隔值,以便逗号不会被误认为是字段分隔符。我很欣赏能够正确处理这些价值的解决方案。此外,您可以假设没有值包含换行符。
答案 0 :(得分:2)
使用GNU awk:
$ cat file
a,"b,c",d,e
$ awk -vFPAT='([^,]*)|("[^"]+")' '{print $2}' file
"b,c"
$ awk -vFPAT='([^,]*)|("[^"]+")' '{print $3}' file
d
$ cat file
a,"b,c",d,e,"f,g,h",i,j
$ awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, -vcols="1,5,7,2" 'BEGIN{n=split(cols,a,/,/)} {for (i=1;i<=n;i++) printf "%s%s", $(a[i]), (i<n?OFS:ORS)}' file
a,"f,g,h",j,"b,c"
有关详细信息,请参阅http://www.gnu.org/software/gawk/manual/gawk.html#Splitting-By-Content。我怀疑它是否处理嵌入在字段中的转义双引号,例如a,"b""c",d
或a,"b\"c",d
。
答案 1 :(得分:1)
答案 2 :(得分:0)
完全成熟的CSV解析器(如Perl的Text::CSV_XS
)专门用于处理这种奇怪现象。
我在答案中提供了示例代码:parse csv file using gawk
答案 3 :(得分:0)
有可用的命令行csvtool
-https://colin.maudry.com/csvtool-manual-page/
# apt-get install csvtool