Вот один из подходов:
awk -F'.' '{for (i=NF;i>1;i--){printf $i"."};print $1}'
Пример использования:
$ echo abc.def.ghi.com | awk -F'.' '{for (i=NF;i>1;i--){printf $i"."};print $1}'
com.ghi.def.abc
Объяснение:
for (i=NF;i>1;i--){printf $i"."
Это печатает части в обратном порядке, начиная с $NF
и заканчивая $2
(второе поле), за каждой частью следует точка.
print $1
Это печатает последнюю часть без завершающего периода. Поскольку здесь используется print
, а не printf
, нет необходимости в явном переводе строки.
альтернатива
Для разнообразия вот еще одно решение:
awk -F'.' '{s=""; for (i=NF;i>0;i--){s=s"."$i};print substr(s,2)}'
При этом используется та же логика, что и в оригинальном сообщении: один цикл по всем частям. Однако вместо того, чтобы печатать на каждом шаге, это сохраняет желаемый результат в строку s
. В конце он печатает s
за исключением последнего символа, который был бы лишним периодом.
Альтернатива с использованием tac
а не awk
$ echo abc.def.ghi.com | tr '.' '\n' | tac | tr '\n' '.' | sed 's/\.$/\n/'
com.ghi.def.abc
Или еще проще:
$ echo abc.def.ghi.com | tac -s'[.\n]'
abc.def.ghi.com