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)
尝试:
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
.
除了第一个元素;然后打印整行$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)
如果您坚持在一行中执行此操作,则可以执行此 perl。基本上 -F 标志与 awk 相同,因此它将@
字符上的每一行分开。一个 liner 的第一部分创建一个名为的变量$s
,该变量具有域的反向部分。one liner 的第二部分打印出反转域,然后是存储在$_
变量中的原始输入。
perl -F'@ ' -lane '$s = join ".", reverse split/\./, $F[-1]; print "$s $_"'
Run Code Online (Sandbox Code Playgroud)