Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / awk-обработка файла / 7 сообщений из 7, страница 1 из 1
09.07.2007, 08:27:30
    #34646452
postt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
awk-обработка файла
Помогите с написанием awk-программы.
Есть файл:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
pole1 pole  2  pole3

 223          a           B
 34            B           a
 3235        c           B
 45            B          c
 56            e           B
 34            r           B
 3245       B           r
 5              B          e
...
В файле чередуются поля 2 и 3, но не всегда друг за другом.
Требуется преобразовать его в формат
Код: plaintext
1.
2.
3.
4.
5.
 223         34        a
 3235       45        c
 56            5          e
 34            3245   r
...
Пробую сделать на awk но пока безуспешно. Может кто уже решал эту задачу или кому-то будет интересно потренироваться?
...
Рейтинг: 0 / 0
09.07.2007, 09:31:19
    #34646526
sanek842
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
awk-обработка файла
ну и извращение ... :)
насколько я правильно понял задачку
вот что получилось :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#!/bin/sh
let i= 0 
cat f1 | while read s; do
 let i=i+ 1 
 f1=`echo $s | awk '{ print $1}'`
 f2=`echo $s | awk '{ print $2}'`
 f3=`echo $s | awk '{ print $3}'`
 nr=`awk 'NR>"'$i'" && $2=="'$f3'" && $3=="'$f2'" { print $1}' f1`
 [ -z $nr ] || echo $f1 $nr $f2
done

да, исх файл с данными называется f1
зачот?
...
Рейтинг: 0 / 0
09.07.2007, 10:25:02
    #34646607
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
awk-обработка файла
предлагаю всё же вариант исключительно на awk

Код: plaintext
awk '{ if($3 in arr){print arr[$3] " " $1 " " $3;delete arr[$3]} else arr[$2]=$1'} < file.txt
...
Рейтинг: 0 / 0
09.07.2007, 10:40:08
    #34646660
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
awk-обработка файла
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
-bash- 2 .05b$ time ./sanek842.sh
 223   34  a
 3235   45  c
 56   5  e
 34   3245  r

real    0m0.234s
user    0m0.011s
sys     0m0.222s
-bash- 2 .05b$ time ./pure_awk.sh
 223   34  a
 3235   45  c
 34   3245  r
 56   5  e

real    0m0.008s
user    0m0.000s
sys     0m0.007s
...
Рейтинг: 0 / 0
09.07.2007, 11:17:29
    #34646802
sanek842
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
awk-обработка файла
ну так то да, у меня на каждую строчку в файле этот файл каждый раз сканируется
с массивом круче конечно и даже как то за один проход, однако в этот вариант еще врубится нужно :)
...
Рейтинг: 0 / 0
09.07.2007, 11:46:38
    #34646894
postt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
awk-обработка файла
Спасибо за примеры, но в них есть недостаток: если строки расположены не друг за другом (последних 4 строки в примере), то скрипты не работают. Можно ли внутри программы на awk запустить еще один цикл прохода по строкам?
Алгоритм примерно такой
1 Читаем строку, берем поле, где значение не B, запоминаем поле 1 и запускаем второй цикл, котрый ищет строки с третьим (если взяли второе) или вторым (если взяли третье) полем и запоминает первое поле этой строки
2 Выводим запомненные в переменных значения итд
Позволяет ли такое awk?
...
Рейтинг: 0 / 0
09.07.2007, 12:02:49
    #34646966
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
awk-обработка файла
Разве?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
-bash- 2 .05b$ cat file.txt
 223          a           B
 34            B           a
 3235        c           B
 45            B          c
 56            e           B
 34            r           B
 3245       B           r
 5              B          e
-bash- 2 .05b$ ./pure_awk.sh
 223   34  a
 3235   45  c
 34   3245  r
 56   5  e
-bash- 2 .05b$ ./sanek842.sh
 223   34  a
 3235   45  c
 56   5  e
 34   3245  r
-bash- 2 .05b$

единственное что - так как на awk пример использует хеш - то порядок не сохраняется.
А sanek842 вообще в точности делает, что вы написали.

3245 он захватил.
Дальше идёт одинокая 5 - она не вывелось, так как алгоритм не нашёл пары, но несложно модифицировать, чтобы одингочки тоже выводились
...
Рейтинг: 0 / 0
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / awk-обработка файла / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]