Linux shell awk:满足条件时显示不同的列值

时间:2012-04-16 06:57:54

标签: linux shell awk

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

  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”,只显示“错误”之类的新值

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

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

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

      $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 
    ....
    

3 个答案:

答案 0 :(得分: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
  }
'

答案 1 :(得分: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

答案 2 :(得分:0)

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