Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Вопрос по скрипту  (Прочитано 460 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн as_lan

  • Автор темы
  • Любитель
  • *
  • Сообщений: 99
    • Просмотр профиля
Вопрос по скрипту
« : 20 Май 2015, 16:32:07 »
Надо написать скрипт. В нем подобный кусок

mod="1 2"
for i in $mod; do
m="`cat file | awk '$1 ~ /$i/ {print $1}'`"
done

содержимое file
1 3 some text
2 2 some text
3 1 some text

То есть по логике берется первый столбец, потом там ищется строки начинающиеся с  1 и 2 (но при этому 3 строку не берем, хоть там и содержится 1) и печатаем первый ее столбец. Знаю что это можно решить связкой grep и awk, но мне захотелось более красивое решение с применением одного awk. Вне цикла это работает. То есть

cat file  | awk '$1 ~ /1/ {print $1}'выдаст мне 1. Но вот внутри цикла это сделать не знаю. не знаю как правильно расставить апострофы.
« Последнее редактирование: 20 Май 2015, 17:41:45 от as_lan »

Оффлайн victor00000

  • Забанен
  • Старожил
  • *
  • Сообщений: 15570
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Вопрос по скрипту
« Ответ #1 : 20 Май 2015, 16:58:10 »
echo "a b c d" | awk '{print NF}'
Нельзя друзья, дулу - AnrDaemon видите?
~.o

Оффлайн as_lan

  • Автор темы
  • Любитель
  • *
  • Сообщений: 99
    • Просмотр профиля
Re: Вопрос по скрипту
« Ответ #2 : 20 Май 2015, 17:00:13 »
victor00000,
Так мне же не нужен подсчет. Или я не понял чего-то?

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6016
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Вопрос по скрипту
« Ответ #3 : 20 Май 2015, 17:00:39 »
Код: Bash
  1. awk '/^[12] /{print $1}' file
Почему awk?
Код: Bash
  1. grep -o '^[12]\b' file
Код: Bash
  1. grep -ow '^[12]' file
« Последнее редактирование: 20 Май 2015, 17:04:35 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн as_lan

  • Автор темы
  • Любитель
  • *
  • Сообщений: 99
    • Просмотр профиля
Re: Вопрос по скрипту
« Ответ #4 : 20 Май 2015, 17:15:02 »
Azure,
Моя вина, не полностью уточнил. Цифры во первых могут быть разной длины. Кроме цифр могут быть и буквы. То есть
cat file
100 30 bla
bla 10 30
10 40 bla
20 bla 10

Мне надо вывести те строки, где первый символ например 10, или в иной ситуации где первое "bla". Поэтому то что вы предложили не работает. Поэтому и решил через awk. Для начала выбрать первый столбец, потом там искать ту или иную комбинацию и вывести ее.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6016
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Вопрос по скрипту
« Ответ #5 : 20 Май 2015, 17:22:12 »
as_lan,
Давайте научимся правильно говорить, чтоб можно было что-то понять. Цифры (в отличие от чисел) не могут быть разной длинны (ну разве что Вы используете какую-то отличную от привычных систему счисления). Зачем выбирать столбец потом что-то искать? А нельзя сразу?
Советую описать что именно Вы хотите сделать|найти, тогда намного проще подсказать правильный метод|инструмент
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн as_lan

  • Автор темы
  • Любитель
  • *
  • Сообщений: 99
    • Просмотр профиля
Re: Вопрос по скрипту
« Ответ #6 : 20 Май 2015, 17:40:51 »
Azure,
Говорю ж сорри, моя вина.

Мне как бы альтернативное решение не обязательно. В первом посте я привел пример команды, которая прекрасно работает так как мне надо. Но как ее засунуть в цикл я не знаю. То есть просто
cat file  | awk '$1 ~ /bla/ {print $1}'или
cat file  | awk '$1 ~ /10/ {print $1}'работает. Но я хочу чтоб работало в цикле

mod="10 bla"
for i in $mod; do
m="`cat file | awk '$1 ~ /$i/ {print $1}'`"
done

В цикле я ничего в выходе не получаю. Пустые строки.


Оффлайн SkinnyJack

  • Любитель
  • *
  • Сообщений: 53
    • Просмотр профиля
Re: Вопрос по скрипту
« Ответ #7 : 20 Май 2015, 18:19:34 »
Код: Bash
  1. mod="10 bla"
  2. for i in $mod; do
  3.     cat file | awk '$1 ~ /$i/ {print $1}'
  4. done


Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6016
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Вопрос по скрипту
« Ответ #8 : 20 Май 2015, 18:20:38 »
1. Переменная внутрь скрипта awk передается так
Код: Bash
  1. awk -v some_name=$i '{...}'
Код: Bash
  1. awk '{...}' some_name=$i
2. Цикл можно выполнять внутри awk
Код: Bash
  1. awk -v list=$mod '{split(list,LIST);for(i in LIST)...}'
3. Нафига городить циклы, если можно использовать регулярки
Код: Bash
  1. awk '/^(10|bla|...) /{...}'
  или предыдущий
Код: Bash
  1. awk -v list=$mod 'BEGIN{split(list,LIST)}$1 in LIST{...}'
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн as_lan

  • Автор темы
  • Любитель
  • *
  • Сообщений: 99
    • Просмотр профиля
Re: Вопрос по скрипту
« Ответ #9 : 20 Май 2015, 20:27:14 »
Azure,
Спасибо.

 

Страница сгенерирована за 0.17 секунд. Запросов: 25.