該數組從split(); x =分裂(A,B)。 我需要按字符串的長度對數組進行排序,從最小到最大。AWK按字符串長度對字符串進行排序
當前的訂單:
B[1]=alnis;
B[2]=nis;
B[3]=connis
所需的順序:
B[1]=nis;
B[2]=alnis;
B[3]=connis
我和GAWK試了一下,procinfo [ 「在分類」] = 「@什麼..」。但我所取得的最大成就是按字母順序排序。
該數組從split(); x =分裂(A,B)。 我需要按字符串的長度對數組進行排序,從最小到最大。AWK按字符串長度對字符串進行排序
當前的訂單:
B[1]=alnis;
B[2]=nis;
B[3]=connis
所需的順序:
B[1]=nis;
B[2]=alnis;
B[3]=connis
我和GAWK試了一下,procinfo [ 「在分類」] = 「@什麼..」。但我所取得的最大成就是按字母順序排序。
asort()
awk支持自定義比較功能,以便您可以定義如何對數組進行排序。
您需要定製的「比較」功能,並使用此比較功能執行asort()
。
如:
kent$ cat f
alnis nis connis
kent$ awk ' function byLength(i1,v1,i2,v2){ return length(v1)-length(v2)}
{x=split($0, a);asort(a,b,"byLength");for(i=1;i<=x;i++)print b[i]}' f
nis
alnis
connis
您可以控制數組遍歷像這樣的順序:
function cmp_len(i1, v1, i2, v2) {
return length(v1) - length(v2)
}
BEGIN {
b[1] = "alnis"
b[2] = "nis"
b[3] = "connis"
PROCINFO["sorted_in"] = "cmp_len"
for (i in b) {
print b[i]
}
}
我已經創建了自己的比較函數,並分配其名稱PROCINFO["sorted_in"]
改變順序元素被遍歷。
測試出來:
$ awk -f script.awk
nis
alnis
connis
您也可以通過這個功能的名字asort
的第三個參數,以排序的值寫入到一個新的數組:
asort(b, sorted, "cmp_len")
請注意,這改變了數組元素的索引,但是而不是它們將以for (i in sorted)
循環遍歷的順序。要以新順序遍歷結果,您需要使用「C樣式」循環或更改PROCINFO["sorted_in"]
,如上所述。
也許更容易排序裝飾/去除裝飾
$ echo -e "alnis\nnis\nconnis" |
while read -r a; do echo -e ${#a}'\t'$a; done |
sort -n | cut -f2
nis
alnis
connis
,或者類似的使用awk
$ echo -e "alnis\nnis\nconnis" |
awk '{print length($0)"\t"$0}' |
sort -n | cut -f2