2016-01-18 3 views
1

Массив получается из split(); x = split (A, B). Мне нужно отсортировать массив по длине строк, от самого маленького до самого большого.AWK сортировать массив строк по длине строки

Текущий заказ:

B[1]=alnis; 
B[2]=nis; 
B[3]=connis 

Желаемый заказ:

B[1]=nis; 
B[2]=alnis; 
B[3]=connis 

Я пробовал с простака, 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-style» или изменить PROCINFO["sorted_in"], как указано выше.

0

возможно проще с сортировать украшения/undecorate

$ 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