awk/sed を使用して一部のメールアドレスを裏返しますか?

awk/sed を使用して一部のメールアドレスを裏返しますか?

まず、ドメインごとに並べ替えたいメールアドレスの長いリストがあるので、次のような行を選択したいと思います。

email: [email protected]
email: [email protected]

そしてこれを得ました:

ru.yandex email: [email protected]
com.changeip.josephay905s email: [email protected]

どうすればいいですか?

以下は、より大きなデータセットです。

email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]

答え1

努力する:

awk -F'@' '
{ split($2, flip, "."); 
  for (i=length(flip); i>=1; i--) printf flip[i] (i!=1?".":" "); 
  print $0;
}' infile
  • @フィールド区切り文字として定義-F'@'
  • ドット区切り文字の2番目のフィールドを.次の配列に分割します。flip
  • 配列の要素を最後から最初に繰り返し、各要素を印刷してから.(最初の要素を除く)、行全体を印刷します$0

注:awkarray_lengthはサポートされていません(参照)AWK - 配列のストレージまたはインデックスを計算する方法)、次のアプローチを試してください。まず、配列が使用する要素の数を見つけ、forループで最大値として使用します。たとえば、次のようになります。

awk -F'@' '
{ split($2, flip, ".");
  max=i=0; for (elements in flip) max++;
  for (i=max; i>=1; i--) printf flip[i] (i!=1?".":" ");
  print $0;
}' infile

答え2

1行にしたい場合は、このPerlを使用してください。デフォルトでは、-Fフラグはawkと同じなので、各行を文字で除算します@。パッドの最初の部分は、$sドメインの反転部分を持つ名前と呼ばれる変数を生成します。 1行の2番目の部分は逆方向ドメインを印刷し、変数に格納されている元の$_入力を印刷します。

perl -F'@ ' -lane '$s = join ".", reverse split/\./, $F[-1]; print "$s $_"'

答え3

#sed -r -n 's/^([^@]+@)(.+)\.([a-z]{2,3})[\r\n\t ]{0,}$/\3.\2 \1\2.\3/gip'  <<< "email: [email protected]"

または

#sed -r -n 's/^([^@]+@)(.+)\.([a-z]{2,3})[\r\n\t ]{0,}$/\3.\2 \1\2.\3/gip'  ./your file

更新:3番目のドメインをサポートするように修正されました。

sed -r -n 's/^([^@]+@)([^\.]+)(\.[^\.]+){0,1}\.([a-z]{2,3})[\r\n\t ]{0,}$/\4\3.\2 \1\2\3.\4/gip'  <<< "email: [email protected]"
result: ru.yandex email: [email protected]

そして

sed -r -n 's/^([^@]+@)([^\.]+)(\.[^\.]+){0,1}\.([a-z]{2,3})[\r\n\t ]{0,}$/\4\3.\2 \1\2\3.\4/gip'  <<< "email: [email protected]"
result: com.changeip.josephay905s email: [email protected]

@TERDON コメントありがとうございます。

答え4

お客様のリクエストを直接実施しました。」最初のドメインによるソート単に各行の先頭に追加の列を作成するのではなく、行ごとに並べ替える準備をします。

sort -t@ -k2,3 -k1,2 file

「大規模データセット」の出力

email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]

ドメイン コンポーネントを「最も重要」から「最も重要ではない」にグループ化する説明で変更された要件を解決するには、次の手順を実行します。

rev file | sort | rev

「より大きなデータセット」の出力を修正

email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]
email: [email protected]

関連情報