The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
сюрприз 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, 18:45 , 12-Мрт-12 (1)
    > 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, !*! Pahanivo, 19:01 , 12-Мрт-12 (2)
    > Почему не обрабатывает первую строчку? Как это сделать?

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

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

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

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

      • сюрприз awk, !*! Pahanivo, 07:23 , 13-Мрт-12 (8)
        > А данные, да - фейк :)

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

        • сюрприз awk, !*! Andrey Mitrofanov, 10:18 , 13-Мрт-12 (9)
          >> А данные, да - фейк :)
          > как в выводе получилось что и

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

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

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

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

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

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


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

  • сюрприз awk, !*! LSTemp, 03:14 , 13-Мрт-12 (7)
    >[оверквотинг удален]
    > 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 - тоже правильно, но ИМХО для скрипта из одной команды совершенно лишнее.




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

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