末尾なしの反転印刷


1

DNSゾーンを呼び出すbashファイル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

1つのアプローチを次に示します。

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"."

    これは、各パートの後にピリオドが続く、2番目のフィールド$NFで開始および停止するパートを逆順に印刷します$2

  • print $1

    これにより、末尾のピリオドなしで最終部分が印刷されます。のでprint、ここで使用されている、というよりもprintf、明示的な改行は必要ありません。

代替案

さまざまな場合、別のソリューションがあります:

awk -F'.' '{s=""; for (i=NF;i>0;i--){s=s"."$i};print substr(s,2)}'

これは、元の投稿と同じロジックを使用します:すべての部分で1つのループ。ただし、各ステップで印刷するのではなく、目的の出力をstringに保存しますss最後に、余分なピリオドとなる最後の文字を除いて印刷します。

代わりに使用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"
マイケルフランク14年

1
@MichaelFrankいくつかの説明を加えて答えを更新しました。簡単に言えば、違いはループがで停止することi==2です。したがって、ループが終了$1しても、印刷する必要があり、余分な後続期間なしで印刷します。
John1024 14年

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。それ以外の場合は、を使用します.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.