День добрый! Нужна помощь. Имеется следующая комбинация:
>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
> День добрый! Нужна помощь. Имеется следующая комбинация:
>>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/
Там есть модули для сортировки.
>[оверквотинг удален]
> вида, (сортировать по колонке и если ел. повтаряется то выводить только
> первый):
>>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! %-)
Спасибо ребят, ваши заметки возму на дальнейший просмотр, а выручил меня старый и добрый perl. Время поджимало, хотя правилнее в моем случае показалось использовать awk, а он для меня оказался монстром)(.
>[оверквотинг удален]
> for (i=0 ; i <= a ;
> i++)
> {
> if (A[i] == A[i-1])
> {
> A[i]=" "
> }
> print A[i],B[i],C[i],D[i]
> }
> }'Кстати, как бы это замутить без внешнего sort?
>[оверквотинг удален]
>> 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) ...
}
}
}
}
>[оверквотинг удален]
>>> }'
>> Кстати, как бы это замутить без внешнего 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]; # вывод
}
}