2010-04-12 4 views
2

У меня есть данные, что выглядит следующим образом:AWK Если/ElseConditional Проблема

foo foo  scaffold_7  1 4845 6422 4845 
bar bar  scaffold_7  -1 14689 16310 16310 

То, что я хочу сделать, это обрабатывать эти строки где я просто хочу, чтобы напечатать колонку 1,2,3, 7 и еще один столбец после 7-го. Но с условием при печати колонки 7 и далее.

Ниже мой AWK сценария:

awk '{ 
     if ($4=="+") { {end=$6-$5}{print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $7 "\t" end+$7} } 
     else 
      {end=$6-$5}{print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $7-end "\t" $7} 
    }' 

Но почему он не достичь желаемого результата, как это?

foo foo scaffold_7  1  4845 6422 
bar bar scaffold_7  -1  14689 16310 

Обратите внимание, что арифметический (например $7-end или end+$7) является обязательным. Поэтому мы не можем просто поменять столбец из входного файла. Кроме того, этот AWK будет находиться в сценарии bash.

ответ

3

Try:

awk 'BEGIN {OFS = "\t"} { 
    end = $6 - $5 
    if ($4 >= 0) { 
     print $1, $2, $3, $4, $7, end + $7 
    } else { 
     print $1, $2, $3, $4, $7 - end, $7 
    } 
}' 

Я никогда не использовал фигурные скобки в фигурные скобки и предпочитают разделители запятой для этой цели. Я довольно уверен, что предложение else привязано только до {end=$6-$5} в вашем примере, а не для обоих скопированных записей. В этом случае для будет выполнено {print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $7-end "\t" $7} все линии.

+0

Neater, короче, легче изменить: 'awk -vOFS = '\ t' '{... print $ 1, $ 2 ...' –

3
awk '{end=$6-$5} 
$4>0{ $0=$1 "\t" $2 "\t" $3 "\t" $4 "\t" $7 "\t" end+$7 } 
$4<=0{$0=$1 "\t" $2 "\t" $3 "\t" $4 "\t" $7-end "\t" $7 }1' file 
Смежные вопросы