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

时间:2019-04-08 10:31:30

标签: shell

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

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

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

假设在第4和第5字段中有空白数据,则应按如下所示打印。

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

但是我正在按照以下方式打印数据。

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

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

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

# print the columns in proper format
     awk 'BEGIN {
      FPAT = "([^,]+)|(\"[^\"]+\")"
     }
     {  if (length($4) == 0) 
        gsub("\"","",$4);

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

可以对此进行什么更改以获得预期的结果。谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

输出如下。

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

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



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

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

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

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

输出如下。

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