Действительно ли "&&" означает И в кодировании AWK? - PullRequest
0 голосов
/ 13 февраля 2020

В настоящее время я отфильтровываю строки с указанным шаблоном c из большого файла данных. Поскольку строки должны соответствовать нескольким правилам, я использую «&&» в awk. Но у меня сложилось впечатление, что он не совсем следует логическому AND.

Мои данные выглядят так:

    Group   EB1_D   EN1_D   EZ1_D   LB1_D   LN1_D   LZ1_D   MB1_D   MN1_D   MZ1_D   TB1_D   TN1_D   TZ1_D   AB1_D   AN1_D   AZ1_D
OG0008871:Down  0.886835651 NA  0.205991042 0.344286962 NA  0.212469765 0.934134739 NA  NA  0.087171422 0.144711362 0.002778751 NA  NA  NA
OG0021381:Down  0.65178744  0.000508521 0.477039947 NA  NA  NA  NA  NA  0.826395809 NA  NA  NA  NA  NA  NA
OG0011803:Up    NA  NA  NA  NA  NA  0.00734476  NA  NA  NA  0.458883104 NA  NA  NA  NA  NA
OG0015725:Up    NA  NA  NA  NA  0.858766006 NA  NA  NA  NA  0.376378076 0.196034543 0.329094645 0.062600211 0.080328374 0.017079806

Я хочу отфильтровать все строки, где B1_D больше, чем любой из другие значения, поэтому я использую следующее (может быть, не самое практичное, но оно должно работать в любом случае:

awk '$2 > $3 && $2 > $6 && $2 > $7 && $2 > $4 && $2 > $9 && $2 > $10 && $2 > $12 && $2 > $13 && $2 > $15 && $2 > $16 && $5 > $3 && $5 > $6 && $5 > $7 && $5 > $4 && $5 > $9 && $5 > $10 && $5 > $12 && $5 > $13 && $5 > $15 && $5 > $16 && $8 > $3 && $8 > $6 && $8 > $7 && $8 > $4 && $8 > $9 && $8 > $10 && $8 > $12 && $8 > $13 && $8 > $15 && $8 > $16 && $11 > $3 && $11 > $6 && $11 > $7 && $11 > $4 && $11 > $9 && $11 > $10 && $11 > $12 && $11 > $13 && $11 > $15 && $11 > $16 && $14 > $3 && $14 > $6 && $14 > $7 && $14 > $4 && $14 > $9 && $14 > $10 && $14 > $12 && $14 > $13 && $14 > $15 && $14 > $16 END {print $0}'

. Применение этого параметра дает только строку OG0015725: UP в качестве вывода. Однако: одно из правил составляет $ 11> $ 6. Значение для $ 11 равно 0,376378076, а для $ 6 - 0,858766006.

Должно быть, поэтому оно не выбрано, но это так. Возможно, я неправильно применял этот код? Странно OG0015725: UP - последняя строка входного файла и меня выбрали во всех моих разных выходных файлах!

Заранее благодарен за любой ввод.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

да, && означает И в оценке состояния awk.

Вы неправильно использовали его, вы должны сделать что-то вроде:

awk '$1>$2 && $2 > $4{ some action }...' input

Что у вас есть:

awk '$1>$2 && $2 > $4 END{.action...}' input

Если вы хотите использовать короткий способ проверки и печати текущей строки:

awk '$1>$2 && $2 > $4; END{...}' input

Кстати, для вашей проверки looooooooong должен быть лучший способ.

0 голосов
/ 13 февраля 2020

здесь лучший подход, чем написание цепочки $1>$2 && $1>$3 && $1>$4

awk 'function max(x,y) { return x>y?x:y }
     function maxof(xs) { n=split(xs,a); m=a[1]; for(i=2;i<=n;i++) m=max(m,a[i]); return m}
     $1 > maxof($2 FS $3 FS $4) {...'

действительно с x>y && x>z <=> x > max(y,z)

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