Awk 如果字段为空或为空,如何打印空格

Awk 如果字段为空或为空,如何打印空格,awk,Awk,我有一个文件名为x.log 07/08/15 05:00:00 07/08/15 05:00:20 DB_XXXLNX9 XXXLNX9已完成 07/09/15 05:00:00 07/09/15 05:00:34 DB_XXXLNX9 XXXLNX9失败 2015年10月7日05:00:00未来 如果任何字段为空,我需要以相同格式打印列。i、 e DB_XXXLNX9应位于上述DB_XXXLNX9之下。由于某些原因,我无法在这个问题上打印出来,我道歉 07/08/15 05:00:00 07

我有一个文件名为x.log

07/08/15 05:00:00 07/08/15 05:00:20 DB_XXXLNX9 XXXLNX9已完成
07/09/15 05:00:00 07/09/15 05:00:34 DB_XXXLNX9 XXXLNX9失败
2015年10月7日05:00:00未来
如果任何字段为空,我需要以相同格式打印列。i、 e DB_XXXLNX9应位于上述DB_XXXLNX9之下。由于某些原因,我无法在这个问题上打印出来,我道歉

07/08/15 05:00:00 07/08/15 05:00:20 DB_XXXLNX9 XXXLNX9已完成
07/09/15 05:00:00 07/09/15 05:00:34 DB_XXXLNX9 XXXLNX9失败
2015年10月7日05:00:00 DB_XXXLNX9 XXXLNX9未来
我试过这个awk声明

awk '{printf "%-10s %-10s %-10s %-10s %-20s %-10s %-10s\n", $1, $2, $3, $4, $5, $6, $7}' x.log 

不是令人满意的解决方案,但效果良好:

 awk '{
    if (NF==5) {
      printf "%-10s %-10s %-10s %-10s %-10s %-10s%-10s %-10s\n", $1, $2, "", "", $3, "", $4, $5; }
    else
      print;
}' x.log
对于不完整的行,确切的空格填充非常奇怪,但需要适合OP:注意一个没有空格的additionnal
%-10s
。这是由于原来的格式


请注意,您不能通过使用OFMT的
来简化这一行,因为它仅用于浮点数。

这可能是您想要的,如果没有更多信息和额外的样本输入/输出,很难判断:

$ awk -v OFS=, 'NF<7{$3=OFS OFS $3} {$1=$1}1' file | column -s, -t
07/08/15  05:00:00  07/08/15  05:00:20  DB_XXXLNX9  XXXLNX9  Completed
07/09/15  05:00:00  07/09/15  05:00:34  DB_XXXLNX9  XXXLNX9  Failed
07/10/15  05:00:00                      DB_XXXLNX9  BETLNX9  Future

$awk-v OFS=,'nf感谢fedorqui格式化查询。awk不知道您缺少字段。它只看到您实际拥有的字段。您需要通过查看列并自己操作来手动填充awk中需要的字段。字段选项卡是否分开?如果没有,脚本如何具体/以编程方式判断缺少哪些字段?是否总是缺少第二个日期和/或时间字段?如果没有,则显示更多不同的输入/输出。第三个和第四个字段通常丢失99%的时间,这是否意味着当任何字段丢失时,总是这两个字段,并且它们在输入文件的99%行中丢失,或者当任何字段丢失时,99%的时间是这两个字段,另外1%是其他字段?请编辑您的问题,使其清晰具体,并提供您希望解决的案例的真正代表性示例输入/输出。感谢Bentoy13提供解决方案。间距有点小,但没关系。