Два полевых деления, awk - PullRequest
       6

Два полевых деления, awk

0 голосов
/ 29 октября 2018

Я застрял с (возможно, очень простой) функцией в awk: я пытаюсь разделить два поля построчно с помощью следующего кода:

awk 'BEGIN{FS=OFS="\t"} $43 > 0 && $31 > 0 {$43/$31; print}' file.tsv

Но я постоянно получаю эту ошибку: fatal: division by zero attempted, но я уже проверил, что знаменатель всегда отличен от нуля (и действительно, я думаю, что код должен отбрасывать нули), и я понятия не имею, что происходит ... любое предложение, пожалуйста? Большое спасибо!

РЕДАКТИРОВАТЬ: таблица ввода имеет этот формат (awk 'BEGIN{FS=OFS="\t"} {print $31,$43}' file.tsv | head -4):

triCount_PM triSum_altPM
3   25
3   7
3   0

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Результатом деления на ноль является заголовок, в котором нет полей для полей, поэтому оба поля равны нулю. Чтобы это работало, вам нужно пропустить заголовок (NR == 1 тесты для первой строки)

$ awk 'NR==1{print "$43/$31"; next} $43>0 && $31>0 {print $43/$31}' file
0 голосов
/ 29 октября 2018

например. "fnord" > 0 оценивается как истина в Awk; вам действительно нужно убедиться, что значения являются правильно числовыми. Обычная уловка для приведения интерпретации чисел состоит в добавлении нуля.

awk 'BEGIN{FS=OFS="\t"} 0+$43 > 0 && 0+$31 > 0 { print $43/$31 }' file.tsv

Просто print всегда печатает $0 (который инициализируется в текущей строке ввода, хотя вы можете изменить ее прямо или косвенно из вашей программы); чтобы напечатать что-то еще, передайте это «что-то еще» в качестве аргумента print.

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