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

Исходное сообщение
"сюрприз awk"

Отправлено KarD_IO , 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

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



Содержание

Сообщения в этом обсуждении
"сюрприз awk"
Отправлено gpl77 , 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}'

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


"сюрприз awk"
Отправлено KarD_IO , 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 }'

Спасибо.


"сюрприз awk"
Отправлено KarD_IO , 12-Мрт-12 19:27 
Сорри, так:

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


"сюрприз awk"
Отправлено gpl77 , 12-Мрт-12 20:02 
> Сорри, так:
> 'BEGIN {FS="="} { print $2 }'

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

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

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


"сюрприз awk"
Отправлено Pahanivo , 12-Мрт-12 19:01 
> Почему не обрабатывает первую строчку? Как это сделать?

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


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

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

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


"сюрприз awk"
Отправлено Pahanivo , 13-Мрт-12 07:23 
> А данные, да - фейк :)

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


"сюрприз awk"
Отправлено Andrey Mitrofanov , 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 - фейк, точнее, видимо, ошибка копи-пасты.


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

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

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


"сюрприз awk"
Отправлено Pahanivo , 13-Мрт-12 17:57 
>> фейк, точнее, видимо, ошибка копи-пасты.

наконецта ))



"сюрприз awk"
Отправлено LSTemp , 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 - тоже правильно, но ИМХО для скрипта из одной команды совершенно лишнее.