2013-08-29 3 views
0

Я хотел бы рассчитать среднее значение столбцов 2 и 3 в каждой строке, добавить 1 к этому значению и распечатать всю строку. Некоторые из средних значений будут числами с плавающей запятой.Арифметика в оболочке Unix Сценарий

Входной файл выглядит следующим образом:

chr20 2330559 2330737 
chr20 2332853 2333041 
chr20 2537555 2537711 

Выходной файл:

chr20 2330648 2330649 
chr20 2332947 2332948 
chr20 2537633 2537634 

Я пробовал различные комбинации AWK без успеха. Любые предложения были бы замечательными! Благодаря Гарриет

ответ

3

Использование AWK для этого:

awk '{$2=($2+$3)/2; $3=$2+1}1' file 

Вы можете также использовать функцию int(), чтобы гарантировать, что результат является целым числом:

awk '{$2=int(($2+$3)/2); $3=$2+1}1' file 
+0

ahh! после того, как я вставил комментарий, (ниндзя), я нажал кнопку «вверх», затем я нашел, что это мой собственный ответ !!! вот место ... – Kent

2

попробовать этот Однострочник:

awk '{a=($2+$3)/2;$2=a;$3=a+1}7' file 

дает

chr20 2330648 2330649 
chr20 2332947 2332948 
chr20 2537633 2537634 
+0

Убейте вас двумя символами: p – user000001

+1

@ user000001 'sed 's/vim/awk /' <<<« Реальные Vim ninjas подсчитывают каждое нажатие клавиши - вы? »' :) – Kent

2

Что-то вроде:

awk '{ printf("%s %d %d", $1, ($2 + $3)/2, ($2 + $3)/2 + 1) }' 

Вы не дали никаких указаний по поводу того, что должно произойти, когда среднее значение не является целым числом.

+0

Если средний не является целым числом, я все равно хотел бы распечатать его как целое или округлить. Спасибо – user1879573

+0

@ user1879573 используйте функцию 'int()' для этого – user000001

+1

@ user1879573 В этом случае мой ответ уже округляется до ближайшего целого. – Phylogenesis