Пакет lldpd, вероятно, является лучшим решением.
lldpctl
Недостатком lldpd является то, что он отправляет запросы ARP, используя жестко заданный MAC-адрес. Если вы установите его на несколько компьютеров на одном и том же коммутаторе, это будет выглядеть как сценарий «подмены Mac». Обработка таких пакетов имеет свои собственные накладные расходы, которые начнут нагружать ЦП вашего коммутатора.
Сawk
:
awk '{ for (i=2;i<=NF;i++) if ($i!="NA"){ print; break } }' file
Перебрать поля, начиная со второго поля, и вывести строку, если найдено поле, не содержащее NA
. Затем разорвите петлю.
С помощью 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
Использование 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
Сgrep
:
egrep -v -x 'g[0-9]+([[:blank:]]+NA)*[[:blank:]]*' filename
Это приводит к тому, что grep не отображает(-v
)строки, где вся строка(-x
)соответствует:
Можно попробовать:
$ 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