use*_*168 2 csv awk text compare zero
我有这个文件
error.log中
[00:00:00.284],501
[00:00:00.417],5,5294100071980
[00:00:02.463],501
[00:00:05.169],501
[00:00:05.529],501
[00:00:05.730],501
所以,如果字段$ 3为空我想要打印"没有价值"
我正在尝试这个代码
awk '{{FS=","} if($3=="") {print $1,$2,"No value"}}'
Run Code Online (Sandbox Code Playgroud)
但它打印
>[00:00:00.284] 501 No value
>[00:00:02.463] 501 No value
>[00:00:05.169] 501 No value
>[00:00:05.529] 501 No value
>[00:00:05.730] 501 No value
>[00:00:07.193] 501 No value
>[00:00:09.899] 501 No value
>[00:00:31.312] 501 No value
Run Code Online (Sandbox Code Playgroud)
awk -F ',' -v OFS=',' '$1 { if ($3=="") $3="No value"; print}' in.txt
Run Code Online (Sandbox Code Playgroud)
-F选项传递字段分隔符.OFS(输出字段分隔符)设置为,,以便输出字段也用,.$1确保仅处理非空行(即,仅当第一个字段为非空时才执行关联操作) - 如果输入文件没有空行,则可以删除此模式.以上是我建议你解决问题的方法,但是这里是你原始命令的问题:
{{FS=","}...
在你的单个动作中 - 由于没有前面的模式被执行每个输入行 - 你FS 为每一行设置变量- 这不仅是不必要的,而且太晚了,因为第一个输入行已经被那个时间解析了(谢谢,@ EdMorton) - 要么在BEGIN块(BEGIN { FS="," })中设置,要么在我的答案中使用命令行选项-F(-F ',').if($3=="") {...}$3为空,则只生成输出- 可能,您想要输出所有行,因此使用此方法您需要一个else分支(以打印未修改的行).print $1,$2,"No value",字符.这是语法的一部分 - 它们只是将传递给的参数分开print.给定单独的参数,print将它们与特殊OFS变量的值连接起来,特殊变量的值默认为单个空格 ; 使用,相反,你必须把它分配给OFS-再次,无论是在BEGIN块或通过-v选项(-v OFS=',').