sed, awk - выбрать строки, в которых каждая последующая цифра больше предыдущей
Файл с буквенно-цифровыми строками известной определенной длины, но позиции цифр различны:
Z2aO9p6u8
4s5yI7H89
e0Dt14g67
3fR46i7I8
R2c0X346d
4U45v7gD9
желаемый тут выход:
4s5yI7H89
e0Dt14g67
3fR46i7I8
требуется выбрать строки, в которых N число цифр (в примере берем 5), и только те, в которых каждая последующая цифра больше по значению, чем предыдущая. Собрал такую рабочую конструкцию:
cat file | grep -e '\([[:digit:]].*\)\{5\}' | while read line; do echo $line | sed 's/[[:alpha:]]*//g' | sed 's/./&:/g;s/$/'"${line}"'/' | awk -F":" '{if ($1 > $2 && $2 > $3 && $3 > $4 && $4 > $5) print$NF}' >> outfile; done
хотел избавиться от цикла, но не получилось применить к опеределенному полю удаление букв:
cat file | grep -e '\([[:digit:]].*\)\{5\}' | awk '{print$0":"$0}' | **sed 's/^[^:]*[[:alpha:]]//g'** ...
как кстати из e0Dt14g67:e0Dt14g67 с помощью sed и awk сделать 01467:e0Dt14g67 ?
Вышеуказанная полная конструкция рабочая, но хотелось бы без цикла и менее громоздкое, более быстродействующее, предпочтительно все же наверное awk уместнее тут, но и sed тоже пригодится. Спасибо.
Ответы (1 шт):
N=5;cat FILE |awk '/([[:digit:]].*){'$N'}/{system("printf "$0" |tr -d \"[[:alpha:]]\"");print " "$0}' |awk '{system("printf "$1" |fold -w1 |sort -u |tr -d \"\n\"");print " "$0}' |awk '$1==$2{print $3}'
немного громоздко но зато универсально