我使用以下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 中使用上述内容可能会遇到问题:
- https://lists.gnu.org/archive/html/bug-gawk/2017-04/msg00000.html
- https://lists.gnu.org/archive/html/bug-gawk/2019-11/msg00000.html
如果是这样,您可以通过以下任一方法解决这些错误:
NF
只需在脚本开头引用,例如添加{ NF }
为第一行,就应该是您所需要的,但如果这不起作用,那么FPAT
通过清除然后在脚本开始处重新分配,例如添加{ oFPAT=FPAT; FPAT=""; FPAT=oFPAT }
为第一行。
答案2
awk -F ',"' 'NR>1{gsub(/\"/,"",$1);print $1}' filename
输出
a,a
c