使用 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",d
或 a,"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
我需要 "extract" CSV 文件中的某些列。要提取的列列表很长,它们的索引不遵循常规模式。到目前为止,我已经想出了一个逗号分隔值的正则表达式,但令我沮丧的是,在 sed 的替换命令的 RHS 端,我不能引用超过 9 个已保存的字符串。有什么想法吗?
请注意,包含逗号的逗号分隔值必须用引号引起来,以免将逗号误认为是字段分隔符。我很感激能够正确处理这些值的解决方案。此外,您可以假设没有任何值包含换行符。
CSV 并不像最初看起来那么容易解析。 这是因为可以有很多不同的分隔符或固定的列宽来分隔数据,而且数据可能包含分隔符本身(转义)。
就像我已经告诉过的那样
使用
使用 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",d
或 a,"b\"c",d
.
另请参阅
成熟的 CSV 解析器,例如 Perl 的 Text::CSV_XS
是专门为处理这种怪异问题而构建的。
我在此处的回答中提供了示例代码:parse csv file using gawk
有 command-line csvtool
可用 - https://colin.maudry.com/csvtool-manual-page/
# apt-get install csvtool