- 论坛徽章:
- 1
|
[ 本帖最后由 gameb_y 于 2015-06-24 23:20 编辑 ]
谢谢大家的帮助。我总结了如下两种方法。
简单易用的
[root@C66-test ~]# sort -t "." -k 1.10,1.11 -k 4,4n 20k.txt
ab-cd-cc-aa 1.2.3.42
ab-cd-cc-aa 1.2.3.42
ab-cd-rc-ab 3.2.3.46
aa-er-vd-cd 3.4.5.61
bc-ki-ee-db 0.3.4.12
bc-ki-ee-db 0.3.4.125
bc-ki-ee-ee 0.3.4.5
ab-cd-cc-ee 1.2.3.41
zz-sd-jk-ee 5.6.7.82
ad-ee-cd-er 5.4.3.23
ee-ad-df-fc 4.5.6.7
ee-ad-df-fc 4.5.6.9
ee-ad-df-fc 4.5.6.21
fd-fe-er-fe 2.3.4.51
bc-ki-de-fg 0.3.4.25
bc-ki-de-fg 0.3.4.225
##此处是一个小技巧:
1.-k 4,4 与 -k 4 区别就是
-k 4,4 是第四个字段的开始到结尾
-k 4 是第四个字段的开始到行尾
这里结果是相同的
2.-k 4,4n
对本字段,使用 -n 排序,就可以写成这样。
扩展 -k 4nr 就是逆序了。
难懂的 awk方法
[root@C66-test ~]# cat 20k.awk
#!/bin/awk
###groups and then sort the ip
###modified by wxr 20150619
{
t1=split($1,a1,"-");
t2=split($2,a2,".");
k=sprintf("%5s%03d",a1[t1],a2[t2]);
a[k]=(a[k]?a[k]"\n"$0:$0)
}
END{
t=asorti(a,b);
for(n=1;n<=t;n++)
print a[b[n]]
}
[root@C66-test ~]# awk -f 20k.awk 20k.txt
ab-cd-cc-aa 1.2.3.42
ab-cd-cc-aa 1.2.3.42
ab-cd-rc-ab 3.2.3.46
aa-er-vd-cd 3.4.5.61
bc-ki-ee-db 0.3.4.12
bc-ki-ee-db 0.3.4.125
bc-ki-ee-ee 0.3.4.5
ab-cd-cc-ee 1.2.3.41
zz-sd-jk-ee 5.6.7.82
ad-ee-cd-er 5.4.3.23
ee-ad-df-fc 4.5.6.7
ee-ad-df-fc 4.5.6.9
ee-ad-df-fc 4.5.6.21
fd-fe-er-fe 2.3.4.51
bc-ki-de-fg 0.3.4.25
bc-ki-de-fg 0.3.4.225
###脚本解释
#!/bin/awk
###groups and then sort the ip
###modified by wxr 20150619
{
t1=split($1,a1,"-")
t2=split($2,a2,".")
k=sprintf("%5s%03d",a1[t1],a2[t2])
#sprintf不会输出到屏幕,会输出到变量k中,格式就是 sprintf 里面规定的,%5s%03d
a1[t1],a2[t2] a1[4],a2[4]
a[k]=(a[k]?a[k]"\n"$0:$0)
##这是一个 ? : 条件运算符
if (a[k]) ;then
a[k]= a[k]"\n"$0;
else
a[k]=$0
fi
}
##处理完
END{
t=asorti(a,b);
#对数组a的下标进行排序,并把排序结果存放到b中,且b的数组名从1开始。
#asorti返回值是数组中元素的个数
for(n=1;n<=t;n++)
print a[b[n]]
###数组嵌套了。
}
##注释完了,还是不懂。放着吧。
最后谢谢大家的帮助,新手不懂如何@。 |
|