URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8955
[ Назад ]

Исходное сообщение
"awk sort array"

Отправлено raba , 08-Дек-10 17:04 
День добрый! Нужна помощь. Имеется следующая комбинация:
>18:34:33 192.168.1.1 u1             192.168.0.10 yyyyyyyyyyyyyyyyy
>18:34:52 192.168.1.1 u2             192.168.0.20 uuuuuuuuuuuuuuu
>18:34:57 192.168.1.1 u2             192.168.0.20  cccccccccccccccccccc
>18:34:57 192.168.1.1 u1             192.168.0.10 aaaaaaaaaaaaaaa

Возможно ли и если да,то как с помощью 'awk' довести до следующего вида, (сортировать по колонке и если ел. повтаряется то выводить только первый):
>192.168.1.1
>
>
>u1    18:34:33 192.168.0.10    yyyyyyyyyyyyyyyyy
>      18:34:57 192.168.0.10   aaaaaaaaaaaaaaa
>
>u2    18:34:52 192.168.0.20   uuuuuuuuuuuuuuu
>      18:34:57 192.168.0.20   cccccccccccccccccccc


Содержание

Сообщения в этом обсуждении
"awk sort array"
Отправлено vle , 08-Дек-10 23:30 
> День добрый! Нужна помощь. Имеется следующая комбинация:
>>18:34:33 192.168.1.1 u1             192.168.0.10 yyyyyyyyyyyyyyyyy
>>18:34:52 192.168.1.1 u2             192.168.0.20 uuuuuuuuuuuuuuu
>>18:34:57 192.168.1.1 u2             192.168.0.20  cccccccccccccccccccc
>>18:34:57 192.168.1.1 u1             192.168.0.10 aaaaaaaaaaaaaaa
> Возможно ли и если да,то как с помощью 'awk' довести до следующего
> вида, (сортировать по колонке и если ел. повтаряется то выводить только
> первый):

Если awk -- это GNU awk, то там есть функции сортировки asort и asorti.
Если хочется портабельного решения, см.
http://sf.net/projects/runawk/
Там есть модули для сортировки.


"awk sort array"
Отправлено pavlinux , 16-Дек-10 02:19 
>[оверквотинг удален]
> вида, (сортировать по колонке и если ел. повтаряется то выводить только
> первый):
>>192.168.1.1
>>
>>
>>u1    18:34:33 192.168.0.10    yyyyyyyyyyyyyyyyy
>>      18:34:57 192.168.0.10   aaaaaaaaaaaaaaa
>>
>>u2    18:34:52 192.168.0.20   uuuuuuuuuuuuuuu
>>      18:34:57 192.168.0.20   cccccccccccccccccccc

$ cat test.txt | sort -k 3 |
          awk '{
                A[a++]=$3; # user
                B[b++]=$4; # time
                C[c++]=$1; # ip
                D[d++]=$5  # message
          }
           END {
                for (i=0 ; i <= a ; i++)
                   {
                    if (A[i] == A[i-1])
                      {
                       A[i]="  "
                    }
                   print A[i],B[i],C[i],D[i]
                }
           }'
Вo! %-)


"awk sort array"
Отправлено raba , 16-Дек-10 11:49 
Спасибо ребят, ваши заметки возму на дальнейший просмотр, а выручил меня старый и добрый perl. Время поджимало, хотя правилнее в моем случае показалось использовать awk, а он для меня оказался монстром)(.

"awk sort array"
Отправлено pavlinux , 16-Дек-10 18:35 
>[оверквотинг удален]
>     for (i=0 ; i <= a ;
> i++)
>        {
>         if (A[i] == A[i-1])
>           {
>            A[i]="  "
>         }
>        print A[i],B[i],C[i],D[i]
>     }
>            }'

Кстати, как бы это замутить без внешнего sort?



"awk sort array"
Отправлено raba , 16-Дек-10 19:02 
>[оверквотинг удален]
>> i++)
>>        {
>>         if (A[i] == A[i-1])
>>           {
>>            A[i]="  "
>>         }
>>        print A[i],B[i],C[i],D[i]
>>     }
>>            }'
> Кстати, как бы это замутить без внешнего sort?

я б как-то так:
uniq(@array1)

sub uniq {
foreach my $ar1 (@array1) {
   foreach my $ar2 (@array2) {
           switch ($ar2) {
                     case ($ar1 eq $ar2) ...
                     case ($ar1 ne $ar2) ...
                     case ($ar1 lt $ar2) ...
           }
   }
}
}


"awk sort array"
Отправлено pavlinux , 16-Дек-10 19:30 
>[оверквотинг удален]
>>>            }'
>> Кстати, как бы это замутить без внешнего sort?
> я б как-то так:
> uniq(@array1)
> sub uniq {
> foreach my $ar1 (@array1) {
>    foreach my $ar2 (@array2) {
>            switch
> ($ar2) {
>            

$ cat test.txt | awk -f sort.awk

Так не хотелось дополнительный массив и переменную.


{
   ARRAY[a++]=$3" "$4" "$1" "$5; # заполняем массив
};
END {
      asort(ARRAY); # ASCII сортировка
        for (i=0 ; i <= a; i++)    # перебираем строки уже отсортированного массива
           {
            split(ARRAY[i], Z, " "); # разбиваем i-ю строку на элементы разделенные пробелом
                                     # и пихаем её в новый массив Z
              if (Z[1] == ID) # если 1-й элемент строки равен эталону
                {
                 Z[1]="  "; # тогда обнуляем его.
            }
            ID = Z[1]; # эталон равен первому элементу строки.
            print Z[1], Z[2], Z[3], Z[4]; # вывод
        }
}