关于shell:如何使用awk命令打印不带双引号的空字符串

How to print an empty string without double quotes using awk command

我正在编写一个shell脚本,该脚本将从输入文件中收集数据,并将此数据存储在以逗号为分隔符的输出文件中。数据主要具有以字符串格式打印的日期。我想按如下方式在输出文件中打印数据。当有数据存在时,我们将其存储在双引号中。但是,当没有数据时,不应将其存储在双引号中。也就是说,空数据不应用双引号引起来。

例如:我要打印7个字段,并且当所有字段中都存在数据时,它应该如下打印。

1
"T83261914N","2018-02-16","2018-01-30","2018-01-01","2018-12-31","4","Accepted"

假设在第4和第5字段中,如果有空数据,则应按以下方式打印。

1
"T83261914N","2017-12-13","2017-12-12",,,"5","Accepted".

但是对于我来说,数据正在按以下方式打印。

1
"T83261914N","2017-12-13","2017-12-12","","","5","Accepted".

当有空数据时,我不希望输出中使用双引号。我已经使用awk命令尝试了以下代码。

但是当有空数据时,双引号仍然会被打印出来。

1
2
3
4
5
6
7
8
9
10
11
# print the columns in proper format
     awk 'BEGIN {
      FPAT ="([^,]+)|("[^"]+")"
     }
     {  if (length($4) == 0)
        gsub(""","",$4);

        printf"%s,%s,%s,%s,%s,%s,%s\
",
              $1, $2, $3, $4, $5, $6, $7
     }' $InputFile > $OutputFile

可以对此进行哪些更改以获取预期的结果。谢谢。


编辑:由于OP现在已经告知了他的样本数据,因此请根据该样本添加解决方案。

1
awk '{gsub(/\\,\\042\\042/,",")} 1'  Input_file

输出如下。

1
"T83261914N","2017-12-13","2017-12-12",,,"5","Accepted"

说明:使用awkgsub,""全局替换为,(这里我使用\\042表示")。然后,我使用1打印已编辑/未编辑的行。

由于您仅显示了预期的输出,而不是Input_file的样本,因此我假设您的Input_file如下所示(作为示例)。

1
2
cat Input_file
T83261914N,2017-12-13,2017-12-12,,,5,Accepted

现在让我们运行以下代码。

1
awk 'BEGIN{FS=OFS=","} {for(i=1;i<=NF;i++){if($i!=""){$i="\\042" $i"\\042"}}} 1' Input_file

输出如下。

1
"T83261914N","2017-12-13","2017-12-12",,,"5","Accepted"