2015-10-22 3 views
1

У меня есть кома разделителей файла, где некоторые значения могут отсутствовать какусловно заменить несколько значений в нескольких столбцах

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

Я хочу изменить некоторые столбцы в числовой; е 0 и т к 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] 

ответ

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 
+0

Просто дополнительный запрос, как можно игнорировать первую строку с этой командой. – discipulus

+0

Да, конечно: 'awk 'BEGIN {FS = OFS =", "; а [2]; a [5]} NR> 1 {для (i в a), если ($ i == "f") $ i = 0; else if ($ i == "t") $ i = 1} 1 'file' – anubhava

Смежные вопросы