所以我有一个很长的电子邮件地址列表,我想首先按域排序,所以我想采用这样的行:
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]