зворотний друк без останнього


1

У мене є bash-файл, що викликає зону dns, і виводить той, fqdnякий мені потрібно вивести у зворотному порядку.

Знизуючий фрагмент робить це добре, за винятком того, що я отримую пробну версію .в кінці, яку я не хочу створити формат імпорту, формату csv (роздільник коми):

... | awk -F'.' '{for (i=NF;i>0;i--){printf $i"."};printf "\n"}' 

Приклад джерела:

abc.def,ghi.com
hjd.dhjs.dhuj.oiuehj.ksjdhf.com

бажані результати:

com.ghi.def.abc
com.ksjdhf.oiuehj.dhuj.dhjs.hjd

поточні результати:

com.ghi.def.abc.
com.ksjdhf.oiuehj.dhuj.dhjs.hjd.

Відповіді:


2

Ось один підхід:

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

Будь-який шанс ви можете пояснити, чому все $1працює "\n"?
Майкл Франк

1
@MichaelFrank Я оновив відповідь з деякими поясненнями. Коротко, різниця полягає в тому, що петля зупиняється на i==2. Таким чином, коли цикл закінчується, його $1ще потрібно роздрукувати, і ми друкуємо його без зайвого періоду.
John1024

0

Ви також можете використовувати printfз іншою змінною: символ для друку після кожного поля.

$ awk -F"[.,]" '{for (i=NF;i>0;i--) printf "%s%s", $i, (i==1?"\n":".")}' file
com.ghi.def.abc
com.ksjdhf.oiuehj.dhuj.dhjs.hjd
  • -F"[.,]"встановлює роздільник поля на .або ,. Таким чином, кожне окреме слово вважатиметься різним полем.
  • (i==1?"\n":".")означає: у випадку iє 1, тоді використовуйте \n; в іншому випадку використовуйте ..
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.