shell - 如何使用 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
可以对此进行哪些更改以获得预期的结果。谢谢。
解决方案
编辑:由于 OP 现在已经讲述了他的示例数据,因此根据该示例添加解决方案。
awk '{gsub(/\,\042\042/,",")} 1' Input_file
输出如下。
"T83261914N","2017-12-13","2017-12-12",,,"5","Accepted"
说明:使用gsub
ofawk
来全局替换,""
with,
(这里我使用\042
for 表示"
)。然后我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"
推荐阅读
- python - 如何在一次迭代中使用 Dijkstra 找到多条最短路径?
- tableau-api - 如何在 Tableau 中根据特定年份隐藏图例元素
- azure - 取消标记自动标记的实体
- angularjs - 面临多个错误,如“mat-form-field”不是已知元素,会阻止网页加载
- sql - 我有很多疑问,我想一步完成
- python - 如何用我自己的权重初始化 Keras 顺序模型中的第二个卷积层?
- sql - SQL计算中间天数
- c# - 无法为 UWP 商店提交构建应用程序包
- javascript - 当它是一个 DOM 元素时封装一个属性是一个好主意吗
- excel - 每按一次按钮取消隐藏 4 列