用awk替换CSV文件中的列值

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)

mkl*_*nt0 9

awk -F ',' -v OFS=',' '$1 { if ($3=="") $3="No value"; print}' in.txt
Run Code Online (Sandbox Code Playgroud)
  • 通过-F选项传递字段分隔符.
  • 变量OFS(输出字段分隔符)设置为,,以便输出字段也用,.
  • 模式$1确保仅处理非空行(即,仅当第一个字段为非空时才执行关联操作) - 如果输入文件没有空行,则可以删除此模式.
  • 如果第3个字段为空,则为其指定字符串"No value"
  • 最后,输出该行(具有可能修改的第三字段).

以上是我建议你解决问题的方法,但是这里是你原始命令的问题:

  • {{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=',').