有条理地替换多列中的多个值

时间:2015-10-22 11:13:07

标签: arrays bash unix awk

我有一个逗号分隔文件,其中某些值可能会丢失,如

1,f,12,f,t,18
2,t,17,t, ,17
3,t,15, ,f,16

我想将一些列更改为数字; f到0和t到1.这里,我只想更改第2列和第5列,不想更改第4列。我的结果文件应该看起来像

1,0,12,f,1,18
2,1,17,t, ,17
3,1,15, ,0,16

我可以使用声明

awk -F, -v  OFS=',' '{ if ( $2 ~ /t/ ) { $2 = 1 } else if ( $2 ~ /f/ ) { $2 = 0 }; print}' test.csv

更改单个列

我也可以使用像

这样的循环
 awk -F, -v  OFS=',' 'BEGIN {
     IFS = OFS = ","
  }
  {     
    for (column = 1; column <= 4; ++column) {
        if ($column ~ /t/) {
          $column = 1
       }
        else if($column ~ /f/) {
           $column = 0
        }
     }    
     print 
   }         
' test.csv

如果它们在一起,则替换多个列。如何更改for循环以仅指定特定列?我知道每个循环都有一个相同的但我无法让它工作。另外,我如何在单个语句中为数组分配多个变量,如

a =[1, 2, 3, 4]

1 个答案:

答案 0 :(得分:3)

你可以使用这个awk:

awk 'BEGIN{ FS=OFS=","; a[2]; a[5] }
          { for (i in a) if ($i=="f") $i=0; else if ($i=="t") $i=1 } 1' file
1,0,12,f,1,18
2,1,17,t, ,17
3,1,15, ,0,16