本帖最後由 ywlscpl 于 2010-08-26 09:34 編輯
一家之言,歡迎探讨。
關于sort的使用,最常用的-k參數的使用,指定幾個-k參數,就是指定幾個排序關鍵域,且按順序依次為第1、第2...關鍵域。
man sort對-k是這麼解釋的:
QUOTE:
-k, --key=POS1[,POS2]
start a key at POS1, end it at POS2 (origin 1)
如果不是很明白,可以這樣了解:
1、-k2,3,表示關鍵域是從第2列到第3列
2、總列數為m列時,sort -k2 等價于 sort -k2,m
關鍵對-k2,m的了解,應該是“從第2列起到第m列止的字元串”,對于-k2,3來說,關鍵域就是第2列到第3列止的字元串。
明确概念後,下面講講sort的排序流程。
PS:翻到很久以前的一個文章
http://bbs.chinaunix.net/viewthr ... &ordertype=0&page=1該貼所問的“為什麼已經用-k3n,3指定隻用第三個域進行排序,sort仍然對第四個域進行了排序?”讓我有了弄清sort排序機制的念頭。
sort -k參數的排序流程,個人了解,歡迎讨論:
1、針對每個-k參數指定的排序關鍵域,依次作為第1、第2、第n關鍵域進行排序
2、針對這n個關鍵域的排序後的結果中,對于這n個關鍵域都相同的行,sort再對這些行進行一次預設resort(未resort前是以原始順序排序的)。
若指定了-s參數(GNU sort),resort不會進行。
-s, --stable
stabilize sort by disabling last-resort comparison
依次解析各個例子:
例子1、可以看到針對關鍵域3進行排序後,不會按原始順序輸出,因為sort又再次進行了resort
[root@Mylinux tmp]# cat file3
uucp:x:5:5:UUCP administrator:/usr/lib/uucp:
uucp:x:6:2:UUCP administrator:/usr/lib/uucp:
uucp:x:5:3:UUCP administrator:/usr/lib/uucp:
uucp:x:6:1:UUCP administrator:/usr/lib/uucp:
[root@Mylinux tmp]# sort -t: -k3,3n file3
等價的awk模拟sort排序流程(-k2,2作用就是模拟sort的resort)
[root@Mylinux tmp]# awk -F: -v OFS=# '{print $3,$0}' file3
5#uucp:x:5:5:UUCP administrator:/usr/lib/uucp:
6#uucp:x:6:2:UUCP administrator:/usr/lib/uucp:
5#uucp:x:5:3:UUCP administrator:/usr/lib/uucp:
6#uucp:x:6:1:UUCP administrator:/usr/lib/uucp:
[root@Mylinux tmp]# awk -F: -v OFS=# '{print $3,$0}' file3 |sort -t# -k1,1n -k2,2
[root@Mylinux tmp]# awk -v OFS=# '{print $2" "$3" "$4,$0}' file3 | sort -t# -k1,1 -k2,2 | awk -F# '{print $2}'
例子2、
sort -k2等價于sort -k2,4,排序關鍵域為第2至第4域為止的字元串
[root@Mylinux tmp]# cat file
a 2 7 1
b 2 4 5
c 9 1 6
d 6 9 7
e 1 8 5
f 8 1 3
g 4 4 3
h 6 3 4
[root@Mylinux tmp]# sort -k2 file
等價awk模拟過程
[root@Mylinux tmp]# awk -v OFS=# '{print $2" "$3" "$4,$0}' file
2 7 1#a 2 7 1
2 4 5#b 2 4 5
9 1 6#c 9 1 6
6 9 7#d 6 9 7
1 8 5#e 1 8 5
8 1 3#f 8 1 3
4 4 3#g 4 4 3
6 3 4#h 6 3 4
[root@Mylinux tmp]# awk -v OFS=# '{print $2" "$3" "$4,$0}' file | sort -t# -k1,1 -k2,2
[root@Mylinux tmp]# awk -v OFS=# '{print $2" "$3" "$4,$0}' file | sort -t# -k1,1 -k2,2 | awk -F# '{print $2}'
例子3、
sort -k2n 等價于sort -k2,4n,可以看到排序結果跟sort -k2不一樣了,關鍵在于前面所說的:
對-k2,m的了解,應該是“從第2列起到第m列止的字元串”,而加了n參數後,導緻對這一關鍵域的排序結果變了
[root@Mylinux tmp]# cat file
[root@Mylinux tmp]# sort -k2n file
awk模拟sort流程
[root@Mylinux tmp]# awk -v OFS=# '{print $2" "$3" "$4,$0}' file | sort -t# -k1,1n -k2,2
[root@Mylinux tmp]# awk -v OFS=# '{print $2" "$3" "$4,$0}' file | sort -t# -k1,1n -k2,2 | awk -F# '{print $2}'
例4、
對此貼的例子進行驗證http://bbs2.chinaunix.net/viewth ... 73591&extra=&page=1
>sort -t, -k2 -k4 file
c2,7,3,13
c1,7,6,24
b2,8,1,17
b1,8,7,15
a1,9,2,21
a2,9,4,11
>sort -t, -k2,2 -k4,4 file
[root@Mylinux tmp]# sort -t, -k2 -k4 file4
[root@Mylinux tmp]# awk -F, -v OFS=# '{print $2","$3","$4,$4,$0}' file4 | sort -t# -k1,1 -k2,2 -k3,3 | awk -F# '{print $NF}'
[root@Mylinux tmp]# sort -t, -k2,2 -k4,4 file4
[root@Mylinux tmp]# awk -F, -v OFS=# '{print $2,$4,$0}' file4 | sort -t# -k1,1 -k2,2 -k3,3 | awk -F# '{print $NF}'