- 論壇徽章:
- 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 區(qū)別就是
-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 里面規(guī)定的,%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);
#對數(shù)組a的下標進行排序,并把排序結果存放到b中,且b的數(shù)組名從1開始。
#asorti返回值是數(shù)組中元素的個數(shù)
for(n=1;n<=t;n++)
print a[b[n]]
###數(shù)組嵌套了。
}
##注釋完了,還是不懂。放著吧。
最后謝謝大家的幫助,新手不懂如何@。 |
|