awk - 仅对非空字段进行列操作

mca*_*tis 2 awk

我想对 csv 文件进行一些更改。该文件如下所示:

.csv 文件:

04.08.1994 22:47;3.3;29;;61.8;1;4.0;1.4;433;
04.08.1994 23:11;;27;93.0;60.6;2;2.0;6.5;133;
04.08.1994 23:48;3.1;;18.4;93.1;1;1.0;6.8;;
Run Code Online (Sandbox Code Playgroud)

所需的输出:

04.08.1994 22:47;33;29;12345;61.8;20;4.0;1.4;433;
04.08.1994 23:11;12345;27;930;60.6;40;2.0;6.5;133;
04.08.1994 23:48;31;12345;184;93.1;20;1.0;6.8;12345;
Run Code Online (Sandbox Code Playgroud)

应该发生以下情况:

  1. 用特殊值替换空字段,例如“12345”。

  2. 仅对非空字段执行某些列的算术运算(乘以 10 或 20)。

我的解决方案:

cat file | awk 'BEGIN {FS=OFS=";"} { for(i=1; i<=NF; i++) if($i ~ /^ *$/) $i = 12345 }; \
{ $2!=12345 && ($2=$2*10); $4!=12345 && ($4=$4*10); $6!=12345 && ($6=$6*20); print}'
Run Code Online (Sandbox Code Playgroud)

到目前为止它的工作。想知道我是否必须在每个列操作之前编写这个 if 条件?或者有更简单的方法吗?也许应该在每个字段的循环中执行所有操作?

Rav*_*h13 5

您能否尝试以下操作(用 GNU 测试和编写awk)。

awk '
BEGIN{
  FS=OFS=";"
}
{
  found=""
  delete a
  for(i=1;i<NF;i++){
    if($i==""){
      a[i]
      $i="12345"
      found=1
    }
  }
}
found{
  $2=2 in a?"12345":$2*10
  $4=4 in a?"12345":$4*10
  $6=6 in a?"12345":$6*20
}
1
' Input_file
Run Code Online (Sandbox Code Playgroud)

输出如下。

04.08.1994 22:47;33;29;12345;61.8;20;4.0;1.4;433;
04.08.1994 23:11;12345;27;930;60.6;40;2.0;6.5;133;
04.08.1994 23:48;31;12345;184;93.1;20;1.0;6.8;12345;
Run Code Online (Sandbox Code Playgroud)