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

Extract columns from a CSV file using Linux shell commands

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

请注意,包含逗号的逗号分隔值必须用引号引起来,以免将逗号误认为是字段分隔符。我很感激能够正确处理这些值的解决方案。此外,您可以假设没有任何值包含换行符。

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

就像我已经告诉过的那样 我会使用一种支持 CVS 库的编程语言。

使用

使用 GNU awk:

$ cat file
a,"b,c",d,e

$ awk -vFPAT='([^,]*)|("[^"]+")' '{print }' file
"b,c"
$ awk -vFPAT='([^,]*)|("[^"]+")' '{print }' 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.

另请参阅 ,了解如何使用 awk 解析 CSV。

成熟的 CSV 解析器,例如 Perl 的 Text::CSV_XS 是专门为处理这种怪异问题而构建的。
我在此处的回答中提供了示例代码:parse csv file using gawk

有 command-line csvtool 可用 - https://colin.maudry.com/csvtool-manual-page/

# apt-get install csvtool