用awk替换CSV文件中的列值

时间:2014-02-08 03:17:00

标签: csv text awk 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"}}'

但它打印

>[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

3 个答案:

答案 0 :(得分:9)

awk -F ',' -v OFS=',' '$1 { if ($3=="") $3="No value"; print}' in.txt
  • 通过-F选项传递字段分隔符。
  • 输出字段分隔符变量OFS设置为,,因此输出字段也以,分隔。
  • 模式$1确保只处理非空行(即,仅当第一个字段为非空时才执行相关操作) - 如果输入文件没有空行,你可以删除这种模式
  • 如果第3个字段为空,则为其分配字符串"无值"
  • 最后,输出该行(带有可能修改的第3个字段)。

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

  • {{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=',')。< / LI>

答案 1 :(得分:2)

你应该发布一些预期的输出,但我想你想要的是:

awk 'BEGIN{FS=OFS=","} NF{print $1, $2, ($3=="" ? "No value" : $3)}' file

答案 2 :(得分:2)

使用此文件

cat file
[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,

awk应该

awk -F, '$3=="" {$3="No value"}1' OFS=, file
[00:00:00.284],501,No value
[00:00:00.417],5,5294100071980
[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