csv - 用 awk 替换 CSV 文件中的列值

标签 csv text awk compare zero

我有这个文件

错误日志

[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

最佳答案

awk -F ',' -v OFS=',' '$1 { if ($3=="") $3="No value"; print}' in.txt
  • 通过 -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=',' )。
  • 关于csv - 用 awk 替换 CSV 文件中的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21641452/

    相关文章:

    bash - 如何用多行搜索和替换多行

    linux - 如果值重复,如何更改段落中的特定值

    excel - 如何在 cygwin 下使用 awk 打印 Excel 电子表格中的字段?

    php - 使用 OpenOffice 制作 csv 文件并使用 php 转储 csv 数据

    json - 从types.JSON.TEXT转换为字符串列表

    C++ 从文本行中读取多个变量

    python - 将文本文档转换为 jsonl(json 行)格式

    php - 使用 csv 上的文件指针

    r - 读取大量数字时使用 fread(R 中的 data.table)的错误?

    javascript - 从 CSV 加载 Google Annotation Chart