Мож кто сталкивалсяфайлик 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Почему не обрабатывает первую строчку? Как это сделать?
> 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}'может еще шелл ваш кавычки отъедает
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 }'
Спасибо.
Сорри, так:'BEGIN {FS="="} { print $2 }'
> Сорри, так:
> 'BEGIN {FS="="} { print $2 }'правильнее так:
'BEGIN {FS="="} \
{ print $2 }'шаблон {действие}
второй шаблон пустой
> Почему не обрабатывает первую строчку? Как это сделать?твой вывод вообще от балды придуман походу ...
>> Почему не обрабатывает первую строчку? Как это сделать?
> твой вывод вообще от балды придуман походу ...Вывод реальный, не стал бы задавать вопроса.
А данные, да - фейк :)
> А данные, да - фейк :)как в выводе получилось что и первое и второе поля по отдельности на выходе дают
2
3
4
>> А данные, да - фейк :)
> как в выводе получилось что иНу, поскольку твоё сообщение #8 "вышло" несколько позже ##1,3,5 и 6, объясняю:
В
awk 'FS="=" { print $1 }'
_присваивание_ FS="=" стоит на месте и выполняет функцию _условия перед блоком исполняемого кода в скобках {}.При обработке первой строки (перед~) FS имеет "стандартное значение", первая строка разбивается на поля по пробелам, пробелов в ней нет, вся строка попадает в $1. После обработки первой строки FS присвоено_новое значение, вторая и далее строки будут разбиваться на поля по-другому.
"Условие" блока всегда истинно, блок выполняется для каждой строки.
Итого: пример с print$1 печатает первую строку целиком, вторую и далее - только то, что после =.
Аналогичный код в Си - if(var=value){...} - считается "традиционной" ошибкой и обычно вызывает предупреждения при компиляции современными компиляторами.
PS: И кстати, да вывод в исходном сообщении команды с print$1 - фейк, точнее, видимо, ошибка копи-пасты.
> Итого: пример с print$1 печатает первую строку целиком, вторую и далее -
> только то, что после =...., что до =. //fix, загляделся на---vv
> фейк, точнее, видимо, ошибка копи-пасты.
>> фейк, точнее, видимо, ошибка копи-пасты.наконецта ))
>[оверквотинг удален]
> 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/bashcat 1.txt | awk -v FS="=" '{ print $1 }'
[root@local 333]# ./c.bsh
0
1
2
3PS
как факт - обычно для шелл все что в двойных кавычках (") = интерпритируемое выражение. поэтому:
- иногда необходимо экранирование символов
- когда экранирование практически не возможно при использовании определенной команды (в силу использования этой командой тех же управляющих символов, что и у шелла), следует использовать опций этой самой команды (они обязательно есть - не дураки делали) дабы отделить мухи от котлет.man Вам в помощь :)
PSS
фfктически FS=field_separator - это только переменная, устанавливаемая на время выполнения скрипта awk. отсюда легко идет -v FS="=", как следует из manPSSS
begin - тоже правильно, но ИМХО для скрипта из одной команды совершенно лишнее.