从 BASH 中的 CSV 文件读取空字符串

从 BASH 中的 CSV 文件读取空字符串

我使用以下gawk脚本从 csv 文件 file.csv 的第一列读取值。
我使用是gawk因为我不想忽略任何嵌入的逗号。

col=`gawk ' 
BEGIN {
FPAT="([^,]+)|(\"[^\"]+\")"
}
{print $1 }' file.csv`

例如,file.csv 是:

col1,col2
"a,a","a,a1"
,"b1"
"c","c1"

问题是,由于第一列的第二行是空的,因此当它从第一列读取值时,它将第二列的值作为第二行的值。

echo $col

回报

a,a
b1
c

但我希望它确认空字符串,如下所示:

a,a

c

我怎样才能实现这种行为?

谢谢你!


更新:
我注意到,如果空字符串/空格位于最后一行,则此方法会忽略它。

col=`gawk ' 
BEGIN {
FPAT="([^,]*)|(\"[^\"]*\")+"
}
{print $1 }' file.csv`

例如,如果 file.csv 如下:

col1,col2
"a,a","a,a1" 
"b","b1" 
,"c1"  

结果将是

col1
a,a
b 

代替

col1
a,a
b 

我可以做什么来解决这个问题?

答案1

+将s (1 次或多次重复)更改为*s (0 次或多次重复),FPAT以便允许空字段:

$ awk '
BEGIN { FPAT="([^,]*)|(\"[^\"]*\")+" }
{ print $1 }
' file.csv
col1
"a,a"

"c"

我还添加了最后一个+,因此它允许在引用字段中使用转义(双引号)引号,例如"foo""bar".

https://stackoverflow.com/questions/45420535/whats-the-most-robust-way-to-efficiently-parse-csv-using-awk有关使用 awk 解析 CSV 的更多信息,即使字段包含换行符也是如此。


正如评论中提到的,这将在 gawk 5.1.0 及更高版本中工作,但由于与FPAT处理相关的 2 个错误,您在 gawk 4.1.4 中使用上述内容可能会遇到问题:

  1. https://lists.gnu.org/archive/html/bug-gawk/2017-04/msg00000.html
  2. https://lists.gnu.org/archive/html/bug-gawk/2019-11/msg00000.html

如果是这样,您可以通过以下任一方法解决这些错误:

  1. NF只需在脚本开头引用,例如添加{ NF }为第一行,就应该是您所需要的,但如果这不起作用,那么
  2. FPAT通过清除然后在脚本开始处重新分配,例如添加{ oFPAT=FPAT; FPAT=""; FPAT=oFPAT }为第一行。

答案2

awk -F ',"' 'NR>1{gsub(/\"/,"",$1);print $1}' filename

输出

a,a

c

相关内容