Удаление строк, содержащих NA в каждом столбце

Пакет lldpd, вероятно, является лучшим решением.

lldpctl

Недостатком lldpd является то, что он отправляет запросы ARP, используя жестко заданный MAC-адрес. Если вы установите его на несколько компьютеров на одном и том же коммутаторе, это будет выглядеть как сценарий «подмены Mac». Обработка таких пакетов имеет свои собственные накладные расходы, которые начнут нагружать ЦП вашего коммутатора.

8
17.09.2019, 16:26
5 ответов

Сawk:

awk '{ for (i=2;i<=NF;i++) if ($i!="NA"){ print; break } }' file

Перебрать поля, начиная со второго поля, и вывести строку, если найдено поле, не содержащее NA. Затем разорвите петлю.

16
27.01.2020, 20:08

С помощью allиз списка Perl ::Модуль Util:

$ perl -MList::Util=all -alne 'shift @F; print unless all { $_ eq "NA" } @F' file
gene  v1  v2  v3  v4
g2    NA  NA  2   3
g4    1   2   3   2
9
27.01.2020, 20:08

Использование GNU sed

sed -e '/g[0-9]\+\(\s*NA\s*\)\+$/d' filename

Краткое пояснение:

g[0-9]\+\(\s*NA\s*\)\+$— это регулярное выражение, соответствующее g, за которым следует хотя бы одна цифра, затем любое количество NAс необязательными пробелами до конца строки.

sed -e '/<regex>/d'удаляет все строки, соответствующие<regex>

Более стандартное регулярное выражение с тем же значением будет:

sed -Ee '/g[0-9]+([[:space:]]*NA[[:space:]]*)+$/d' filename
10
27.01.2020, 20:08

Сgrep:

egrep -v -x 'g[0-9]+([[:blank:]]+NA)*[[:blank:]]*' filename

Это приводит к тому, что grep не отображает(-v)строки, где вся строка(-x)соответствует:

  • строчная буква g в первом столбце, за которой следует одна или несколько цифр
  • любое количество пробелов, за которыми следует NA
  • необязательный пробел в конце
9
27.01.2020, 20:08

Можно попробовать:

$ grep -P '\t(?!NA(\t|$))' file

$ sed -e 'h;s/\tNA//g;/\t/!d;g' file

$ perl -MList::MoreUtils=any -F'\t' -lane 'print if any { ! /^NA$/ } @F[1..$#F]' file 
2
27.01.2020, 20:08

Теги

Похожие вопросы