The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"awk sort array"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"awk sort array"  +/
Сообщение от raba (ok) on 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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "awk sort array"  +/
Сообщение от vle (ok) on 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/
Там есть модули для сортировки.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "awk sort array"  +/
Сообщение от pavlinux (ok) on 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! %-)

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "awk sort array"  +/
Сообщение от raba (ok) on 16-Дек-10, 11:49 
Спасибо ребят, ваши заметки возму на дальнейший просмотр, а выручил меня старый и добрый perl. Время поджимало, хотя правилнее в моем случае показалось использовать awk, а он для меня оказался монстром)(.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "awk sort array"  +/
Сообщение от pavlinux (ok) on 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?


Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "awk sort array"  +/
Сообщение от raba (ok) on 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) ...
           }
   }
}
}

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "awk sort array"  +/
Сообщение от pavlinux (ok) on 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]; # вывод
        }
}

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру