AWK If / ElseConditional Problem - PullRequest
       9

AWK If / ElseConditional Problem

2 голосов
/ 12 апреля 2010

У меня есть данные, которые выглядят так:

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.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2010
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
3 голосов
/ 12 апреля 2010

Попробуйте:

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 привязано only к {end=$6-$5}, а не к обеим скобкам. В этом случае {print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $7-end "\t" $7} будет выполнено для всех строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...