IMHO было бы более естественно использовать пустую строку в качестве разделителя записей. В этом «режиме абзаца» awk включает символы новой строки в качестве разделителей полей, поэтому в вашем случае каждая строка записи становится полем. Затем вы можете удалить первое поле, присвоив ему пустую строку; у этого есть хороший побочный эффект переоценки всей записи с заданным разделителем выходных полей: при установке этого значения также на пустую строку, остальные поля объединяются. Затем вы можете просто распечатать длину записи.
awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene
Тестирование с заданными вами входными данными
$ awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene
160
Это не очень переносимо, но для этого конкретного случая работает grep
:
echo $var | egrep -o '[0-9].*-[0-9]'
1.2.6-6
Как сказал триг, , если вы извлекаете значения в той же системе, где установлены эти пакеты, вы можете запросить RPM для версия напрямую:
ver=$(rpm --queryformat="%{VERSION}" -q nfs-utils)
Используя только мощность bash, это лучшее, что я нашел до сих пор:
varnums=$(echo ${var//[^0-9]/ })
var_version=${varnums// /.}
echo $varversion
Результат будет примерно таким:
1.2.6.6.17.686
Не так уж плохо, не так ли?
Последние 2 символа '-' окружают версию.
Таким образом, можно написать *RE, привязанный к концу строки с помощью '$'
Например.
$ echo nfs-utils-1.2.6-6.fc17.i686.rpm | sed -e 's,.*-\([^-]*\)-[^-]*$,\1,'
1.2.6