1

如何在 awk 命令中同时使用条件语句和循环语句将具有特殊值的文件转换为不同的值,如“Error”,而不做任何减法,而是只显示转换后的新值,如“Error”作为输出?

  1. 如果没有一个列值(除了在最终输出中保持不变的第 1 列)等于“11111”之类的特殊值,我使用如下 awk 命令:

    awk -F, '{print $1,$2,($3-$2),($4-$2),($5-$2),($6-$2),($7-$2),($8-$2),($9-$2),($10-$2),($11-$2),($12-$2),($13-$2),($14-$1)} ' all.cvs
    
  2. 如果列值=特殊值,则不需要做“-$2”,只需显示一个新值,如“错误”

基本上我想要:x 表示列 #2 到 #14 的列值

  • 如果 $2(第 2 列)= 11111

    set $2="Error"
    
  • 如果列值为 <> 11111,则为 $3 到 $14(列 #3 到 #14)

    $x=$x-$2 
    
  • 如果列值 =11111

    $x=Error
    
  • 最后,输出仍将显示 14 列,包括原始的 #1 列值和列 #2 到 #14 的转换/计算的新值

我有一个文件(all.cvs),如下所示:

  • 14 个字段

  • 每行可能包含一个字段,其值类似于“11111”(或任何字符串值)

  • 每列用“,”分隔

  • 总行数为 90


$cat all.cvs

A,11111,2,3,4,5,6,7,8,9,10,11,12,13 

B,1,2,3,4,5,6,11111,8,9,10,11,12,13 

C,1,2,3,4,5,6,7,8,9,11111,11,12,13 
....
4

3 回答 3

3
awk -F, -v OFS=, -v flag_value=11111 '
  {subtract = $2}
  $2 == flag_value {$2 = "Error"; subtract = 0}
  {
    for (i=3; i<=NF; i++) $i = ($i == flag_value ? "Error" : $i - subtract)
    print
  }
'
于 2012-04-16T15:31:28.317 回答
1

您可以使用以下方法:

$ awk -F, '
{ 
  printf("%s", $1); 
  s=($2 != 11111 ? $2 : 0); 
  printf(", %s", ($2 != 11111 ? $2 : "Error")); 
  for (i=3; i<=NF; ++i) 
    printf (", %d", ($i != 11111 ? ($i - s) : "Error")); 
  printf("\n"); 
}' all.csv
于 2012-04-16T08:23:53.827 回答
0

将条件块放在默认块之前。放在next每个末尾,以便继续处理下一行。

于 2012-04-16T07:05:02.383 回答