使用Linux shell命令从CSV文件中提取列

时间:2015-04-17 18:34:57

标签: regex csv awk sed gawk

我需要"提取" CSV文件中的某些列。要提取的列的列表很长,并且它们的索引不遵循常规模式。到目前为止,我已经提出了一个逗号分隔值的正则表达式,但我发现令人沮丧的是,在sed的替换命令的RHS方面,我不能引用超过9个保存的字符串。关于这个的任何想法?

请注意,必须引用包含逗号的逗号分隔值,以便逗号不会被误认为是字段分隔符。我很欣赏能够正确处理这些价值的解决方案。此外,您可以假设没有值包含换行符。

4 个答案:

答案 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",da,"b\"c",d

答案 1 :(得分:1)

CSV并不像第一次那样容易解析。 这是因为可以有很多不同的分隔符或固定的列宽来分隔数据,而且数据也可能包含分隔符本身(转义)。

就像我已经告诉here我会使用支持CVS库的编程语言。

使用

答案 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