まず、ドメインごとに並べ替えたいメールアドレスの長いリストがあるので、次のような行を選択したいと思います。
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
。
注:awk
array_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]