Попробуйте:
$ echo 0,2,4-6,8 | awk '/-/{for (i=$1; i<=$2; i++)printf "%s%s",i,ORS;next} 1' ORS=' ' RS=, FS=-
0 2 4 5 6 8
Это можно использовать в цикле следующим образом:
for n in $(echo 0,2,4-6,8 | awk '/-/{for (i=$1; i<=$2; i++)printf "%s%s",i,ORS;next} 1' RS=, FS=-)
do
echo cpu="$n"
done
, который производит вывод:
cpu=0
cpu=2
cpu=4
cpu=5
cpu=6
cpu=8
Или как:
printf "%s" 0,2,4-6,8 | awk '/-/{for (i=$1; i<=$2; i++)printf "%s%s",i,ORS;next} 1' RS=, FS=- | while read n
do
echo cpu="$n"
done
, который также производит:
cpu=0
cpu=2
cpu=4
cpu=5
cpu=6
cpu=8
Как это работает
Команда awk работает следующим образом:
RS=,
Это говорит awk использовать ,
в качестве разделителя записей.
Если, например, ввод 0,2,4-6,8
, то awk увидит четыре записи: 0
и 2
и 4-6
и 8
.
FS=-
Это говорит awk об использовании -
в качестве разделителя полей.
Если установить FS
таким образом, и, например, если входная запись состоит из 2-4
, то awk увидит 2
в качестве первого поля и 4
в качестве второго поля.
/-/{for (i=$1; i<=$2; i++)printf "%s%s",i,ORS;next}
Для любой записи, содержащей -
, мы печатаем каждое число, начиная со значения первого поля, $1
и заканчивая значениемвторое поле, $2
.За каждым таким номером следует разделитель выходных записей, ORS
.По умолчанию ORS
является символом новой строки.Для некоторых из приведенных выше примеров мы устанавливаем пустое значение ORS
.
После того, как мы напечатали эти числа, мы пропускаем остальные команды и переходим к записи next
.
1
Если мы попадем сюда, то запись не будет содержать -
, и мы распечатаем ее как есть.1
является сокращением awk для печати строки.