首页 > 解决方案 > 如何使用 awk 命令打印不带双引号的空字符串

问题描述

我正在编写一个 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

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

标签: shell

解决方案


编辑:由于 OP 现在已经讲述了他的示例数据,因此根据该示例添加解决方案。

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

输出如下。

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

说明:使用gsubofawk来全局替换,""with,(这里我使用\042for 表示")。然后我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"

推荐阅读