2012-05-30 1 views
3

Я ищу вашу помощь в хранении awk, возвращающем значения в массиве для моего awk для цикла, используя условия else.awk for loop with if else условия для массива

If $3 == $7 
then print $9 multiplied by $4 
else print $4 multiplied by (2 minus $9) 

Я получил эту работу до сих пор:

awk '{if ($3 == $7) print $9*$4; else print $4*(2-$9);}' file >outfile 

выше код работает для первого столбца данных ($9). Тем не менее, я хочу перебрать все столбцы с 9 по 1547 и вернуть массив, содержащий возвращаемые значения. Это должно быть достаточно простым, но я не могу понять некоторые основные понятия здесь.

До сих пор я понимаю необходимость объявлять количество циклов, до фактической функции по:

AWK '{для (I = 9; я < = NF; я ++)} END {если ($ 3 == $ 7) print $ i * $ 4; else print $ 4 * (2- $ i);} '

Однако, как и когда объявлять массив вне меня (биолог). Любая помощь будет высоко оценен.

Пример:

вход (большой файл .. здесь колонки 1-10):

rs2070501 22. 0,0206 0,337855 rs2070501 Г.А. 0,977 0,066

выход:

0.0210738

здесь еще заявление пинки в ($ 3 * (2- $ 9)

Как получить AWK, чтобы распечатать массив 9-NTH, а не просто колонка 9

+0

Что вы подразумеваете под "return a array"? Можете ли вы показать ввод и вывод образцов? – tripleee

+0

Блок 'END' - это то, что происходит, когда все строки были прочитаны. Вы имеете в виду что-то вроде 'awk '{for (i = 9; i <= NF; ++ i) printf"% s% i ", (i == 9?" ":" "), ($ 3 == $ 7 ? $ i * $ 4: $ 4 * (2- $ i)); printf "\ n"} '' возможно? – tripleee

+0

@ triplee ваш код кажется многообещающим, но возвращает только «0» в каждой ячейке. Но имеет правильное количество столбцов. – MortenM

ответ

4

Попробуйте с этим.

awk '{ 
    for(i=9; i<=NF; ++i) 
     printf "%s%f", 
      (i==9 ? "" : " "), 
      ($3 == $7 ? $i*$4 : $4*(2-$i)); 
    printf "\n" 
}' filename 

(test ? when : else) - это всего лишь стенография; материал после ? оценивается, если тест верен, и материал после : в противном случае. Поэтому он печатает пустой разделитель для первого поля и пробел в противном случае; и выбирает, как вычислить значение поля в зависимости от того, является ли значение $3 == $7.