2016-01-18 168 views
1

該數組從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 [ 「在分類」] = 「@什麼..」。但我所取得的最大成就是按字母順序排序。

回答

0

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 
0

您可以控制數組遍歷像這樣的順序:

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"],如上所述。

0

也許更容易排序裝飾/去除裝飾

$ 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 
相關問題