The OpenNET Project / Index page

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

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

"сюрприз awk"  +/
Сообщение от KarD_IO on 12-Мрт-12, 17:57 
Мож кто сталкивался

файлик 1.list
0=1
1=2
2=3
3=4

делаем так
cat 1.list | awk 'FS="=" { print $1 }'

Вывод
0=1
2
3
4

делаем так
cat 1.list | awk 'FS="=" { print $2 }'

Вывод

2
3
4

Почему не обрабатывает первую строчку? Как это сделать?


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

Оглавление

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


1. "сюрприз awk"  +/
Сообщение от gpl77 (ok) on 12-Мрт-12, 18:45 
> cat 1.list | awk 'FS="=" { print $1 }'
> Почему не обрабатывает первую строчку? Как это сделать?

У меня не получилось воспроизвести :-)
awk version 20091126 (FreeBSD)

попробуйте так
cat 1.list | awk 'BEGIN {FS="="} \
{print $2}'

или так
cat 1.list | awk -F = '{print $2}'

может еще шелл ваш кавычки отъедает

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

3. "сюрприз awk"  +/
Сообщение от KarD_IO on 12-Мрт-12, 19:23 
FreeBSD 7.2
awk version 20070501 (FreeBSD)

> попробуйте так
> cat 1.list | awk 'BEGIN {FS="="} \
> {print $2}'

сработало как нужно


> или так
> cat 1.list | awk -F = '{print $2}'

сработало как нужно


> может еще шелл ваш кавычки отъедает

пробовал другой - нет

т.е. конструкция awk 'FS="=" { print $2 }' должна быть записана как 'BEGIN {FS="=" { print $2 }'

Спасибо.

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

5. "сюрприз awk"  +/
Сообщение от KarD_IO on 12-Мрт-12, 19:27 
Сорри, так:

'BEGIN {FS="="} { print $2 }'

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

6. "сюрприз awk"  +/
Сообщение от gpl77 (ok) on 12-Мрт-12, 20:02 
> Сорри, так:
> 'BEGIN {FS="="} { print $2 }'

правильнее так:
'BEGIN {FS="="} \
{ print $2 }'

шаблон {действие}

второй шаблон пустой

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

2. "сюрприз awk"  +/
Сообщение от Pahanivo (ok) on 12-Мрт-12, 19:01 
> Почему не обрабатывает первую строчку? Как это сделать?

твой вывод вообще от балды придуман походу ...

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

4. "сюрприз awk"  +/
Сообщение от KarD_IO on 12-Мрт-12, 19:24 
>> Почему не обрабатывает первую строчку? Как это сделать?
> твой вывод вообще от балды придуман походу ...

Вывод реальный, не стал бы задавать вопроса.

А данные, да - фейк :)

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

8. "сюрприз awk"  +/
Сообщение от Pahanivo (ok) on 13-Мрт-12, 07:23 
> А данные, да - фейк :)

как в выводе получилось что и первое и второе поля по отдельности на выходе дают
2
3
4

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

9. "сюрприз awk"  +/
Сообщение от Andrey Mitrofanov on 13-Мрт-12, 10:18 
>> А данные, да - фейк :)
> как в выводе получилось что и

Ну, поскольку твоё сообщение #8 "вышло" несколько позже ##1,3,5 и 6, объясняю:

В
    awk 'FS="=" { print $1 }'
_присваивание_ FS="=" стоит на месте и выполняет функцию _условия перед блоком исполняемого кода в скобках {}.

При обработке первой строки (перед~) FS имеет "стандартное значение", первая строка разбивается на поля по пробелам, пробелов в ней нет, вся строка попадает в $1. После обработки первой строки FS присвоено_новое значение, вторая и далее строки будут разбиваться на поля по-другому.

"Условие" блока всегда истинно, блок выполняется для каждой строки.

Итого: пример с print$1 печатает первую строку целиком, вторую и далее - только то, что после =.

Аналогичный код в Си - if(var=value){...} - считается "традиционной" ошибкой и обычно вызывает предупреждения при компиляции современными компиляторами.


PS: И кстати, да вывод в исходном сообщении команды с print$1 - фейк, точнее, видимо, ошибка копи-пасты.

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

10. "сюрприз awk"  +/
Сообщение от Andrey Mitrofanov on 13-Мрт-12, 10:21 
> Итого: пример с print$1 печатает первую строку целиком, вторую и далее -
> только то, что после =.

..., что до =. //fix, загляделся на---vv

> фейк, точнее, видимо, ошибка копи-пасты.

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

11. "сюрприз awk"  +/
Сообщение от Pahanivo (ok) on 13-Мрт-12, 17:57 
>> фейк, точнее, видимо, ошибка копи-пасты.

наконецта ))


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

7. "сюрприз awk"  +/
Сообщение от LSTemp (ok) on 13-Мрт-12, 03:14 
>[оверквотинг удален]
> 2
> 3
> 4
> делаем так
> cat 1.list | awk 'FS="=" { print $2 }'
> Вывод
> 2
> 3
> 4
> Почему не обрабатывает первую строчку? Как это сделать?

[root@local 333]# cat 1.txt
0=1
1=2
2=3
3=4

[root@local 333]# cat c.bsh
#!/bin/bash

cat 1.txt | awk -v FS="=" '{ print $1 }'

[root@local 333]# ./c.bsh
0
1
2
3

PS
как факт  - обычно для шелл все что в двойных кавычках (") = интерпритируемое выражение. поэтому:
- иногда необходимо экранирование символов
- когда экранирование практически не возможно при использовании определенной команды (в силу использования этой командой тех же управляющих символов, что и у шелла), следует  использовать опций этой самой команды (они обязательно есть - не дураки делали) дабы отделить мухи от котлет.

man Вам в помощь :)

PSS
фfктически FS=field_separator - это только переменная, устанавливаемая на время выполнения скрипта awk. отсюда легко идет -v FS="=", как следует из man

PSSS
begin - тоже правильно, но ИМХО для скрипта из одной команды совершенно лишнее.

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

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

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




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

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