使用 awk/sed 来翻转一些电子邮件地址?

Sam*_*ton 4 sed awk text-processing

所以我有一个很长的电子邮件地址列表,我想首先按域排序,所以我想采取这样的行:

email: vgnerov@yandex.ru
email: petebll@josephay905s.changeip.com
Run Code Online (Sandbox Code Playgroud)

得到这个:

ru.yandex email: vgnerov@yandex.ru
com.changeip.josephay905s email: petebll@josephay905s.changeip.com
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

这是一个更大的数据集:

email: nataliyarezvaya@rambler.ru
email: natalyasoborova1975@rambler.ru
email: noelmrunyon@gmail.com
email: novikova33novickova@yandex.ru
email: o9yp7@gmail.com
email: ontorsckyvladislav@yandex.ru
email: p.ri.me.grani.t2.01.9@gmail.com
email: p3ost51@moail.ru
email: pavelsib@meta.ua
email: pedrika@yandex.ru
email: petebll@josephay905s.changeip.com
email: philip@hugosinbox.xyz
email: pjkraik@zfilm6.ru
email: post@b-monitor.ru
Run Code Online (Sandbox Code Playgroud)

αғs*_*нιη 6

尝试:

awk -F'@' '
{ split($2, flip, "."); 
  for (i=length(flip); i>=1; i--) printf flip[i] (i!=1?".":" "); 
  print $0;
}' infile
Run Code Online (Sandbox Code Playgroud)
  • 定义@为字段分隔符-F'@'
  • 将点.分隔符上的第二个字段拆分为一个名为的数组flip
  • 从最后一个到第一个循环遍历数组的元素,每个 printf 并打印回.除了第一个元素;然后打印整行$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
Run Code Online (Sandbox Code Playgroud)


Mar*_*try 5

如果您坚持在一行中执行此操作,则可以执行此 perl。基本上 -F 标志与 awk 相同,因此它将@字符上的每一行分开。一个 liner 的第一部分创建一个名为的变量$s,该变量具有域的反向部分。one liner 的第二部分打印出反转域,然后是存储在$_变量中的原始输入。

perl -F'@ ' -lane '$s = join ".", reverse split/\./, $F[-1]; print "$s $_"'
Run Code Online (Sandbox Code Playgroud)