使用 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'@'
  • 将点分隔符上的第二个字段拆分.为名为的数组flip
  • 从最后一个到第一个循环遍历数组的元素,并打印每个元素并打印回来.(除了第一个元素);然后打印整行$0

注意:对于awk不支持 array_length 的(请参阅AWK - 如何计算数组上的存储或索引),请尝试下面的方法,即首先查找数组采用了多少个元素并将其用作 for 循环中的 max ,例如:

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

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

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

更新:已修复以支持第三个域

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]

相关内容