Подстановка в awk print $*

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Закрыто
Аватара пользователя

Автор темы
root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

Подстановка в awk print $*

#1

31 авг 2018, 16:31

Есть конструкция типо такой:

Код: Выделить всё

declare -a settings
for i in {1..11}; do
    print_number="\$$[i+3]"
    settings[$i]="$(бла-бла-бла-неважно | awk -F ',' '{print $print_number}')"
done
т.е. в принт по идеи должно прилетать $4, $5, $6 и т.д., но он почему-то это не воспринимает.

Вопрос 1: почему?
Вопрос 2: существует ли способ заставить понимать?

Решение Chocobo » 31 авг 2018, 17:07
не суть, на самом деле при ''$something' будет сохранено именно как строка $something.
т.е. в '{print $print_number}' будет пробовать так и обработать.
root писал(а):
31 авг 2018, 16:31
заставить понимать?

Код: Выделить всё

for i in {1..11}; do
     print_number="\$$[i+3]";
     settings[$i]="$(echo "раз,два,три,четыре,пять,\
     шесть,семь,восемь,девять,десять,одиннадцать, \
     двенадцать, тринадцать, четрынадцать, пятнадцать." | awk -F "," "{print $print_number}")"; 
done
в $print_number попадут

Код: Выделить всё

$4
$5
$6
$7
$8
$9
$10
$11
$12
$13
$14
а в массив settings сами подстроки

Код: Выделить всё

chocobo@desktop:~$ echo ${settings[@]}
четыре пять шесть семь восемь девять десять одиннадцать двенадцать тринадцать четрынадцать

Перейти к ответу ➙
Вы не готовы! :pc2:
Изображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3010 раз
Контактная информация:

Подстановка в awk print $*

#2

31 авг 2018, 16:43

root писал(а):
31 авг 2018, 16:31
в принт по идеи должно прилетать $4, $5, $6
не должно, как минимум в данном примере он не будет интерпертировать $ в одинарных кавычках.
Вот простой пример
Снимок экрана от 2018-08-31 16-42-56.png
Изображение
   
Изображение

Аватара пользователя

Автор темы
root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

Подстановка в awk print $*

#3

31 авг 2018, 16:50

Chocobo, это при условии, что там $1 и т.д. - переменные. Интересно, что они содержат? Лично я её воспринимаю конкретно в данном случаи (print в awk) как управляющую конструкцию, а не переменную.

Фигню написал, я тебя понял.
Вы не готовы! :pc2:
Изображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3010 раз
Контактная информация:

Подстановка в awk print $*

#4

31 авг 2018, 17:07

не суть, на самом деле при ''$something' будет сохранено именно как строка $something.
т.е. в '{print $print_number}' будет пробовать так и обработать.
root писал(а):
31 авг 2018, 16:31
заставить понимать?

Код: Выделить всё

for i in {1..11}; do
     print_number="\$$[i+3]";
     settings[$i]="$(echo "раз,два,три,четыре,пять,\
     шесть,семь,восемь,девять,десять,одиннадцать, \
     двенадцать, тринадцать, четрынадцать, пятнадцать." | awk -F "," "{print $print_number}")"; 
done
в $print_number попадут

Код: Выделить всё

$4
$5
$6
$7
$8
$9
$10
$11
$12
$13
$14
а в массив settings сами подстроки

Код: Выделить всё

chocobo@desktop:~$ echo ${settings[@]}
четыре пять шесть семь восемь девять десять одиннадцать двенадцать тринадцать четрынадцать
Изображение
   
Изображение

Аватара пользователя

Автор темы
root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

Подстановка в awk print $*

#5

31 авг 2018, 17:18

Chocobo, логично, спасибо :thumbs:
Вы не готовы! :pc2:
Изображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3010 раз
Контактная информация:

Подстановка в awk print $*

#6

31 авг 2018, 17:27

Ну а я в свою очередь глядя на
settings[$i]="$(echo "раз,два,три,четыре,пять"| awk -F "," "{print $print_number}")"

Не особо пока понимаю почему оно коррректно работает без экранирований. :-D
Может вечер пятницы уже замылили взгляд, но пока не допираю)
Изображение
   
Изображение

Аватара пользователя

Автор темы
root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

Подстановка в awk print $*

#7

31 авг 2018, 19:14

Chocobo, он встречает | и считает, что "раз,два,три,четыре,пять" - здесь кавычки для echo. "$( )" - результат выполнения команды, ассоциируется с ``. дальше по коду понятно "," и "{print $print_number}"
P.S: хотя подсветку синтаксиса в xed эта логика, действительно сломала))
Вы не готовы! :pc2:
Изображение

Аватара пользователя

Автор темы
root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

Подстановка в awk print $*

#8

31 авг 2018, 19:18

Chocobo, ыы)
2_montage.png
Вы не готовы! :pc2:
Изображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3010 раз
Контактная информация:

Подстановка в awk print $*

#9

31 авг 2018, 20:15

root писал(а):
31 авг 2018, 19:14
"$( )" - результат выполнения команды, ассоциируется с ``
Это думаю ты ему льстишь в интеллекте, что интерпретатор сам разрулит эту вложенность внутри кавычек :hoho: Надо бы проверить, баш - коварная штука)
Изображение
   
Изображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3010 раз
Контактная информация:

Подстановка в awk print $*

#10

31 авг 2018, 20:34

http://www.gnu.org/software/bash/manual ... uotes.html
http://www.gnu.org/software/bash/manual ... uotes.html

И действительно он начинает интерпретировать выражение $() с момента открытия скобки. Внутри двойных кавчек тоже. Ты прав :)
Снимок экрана от 2018-08-31 20-36-22.png
Но выглядит это очень отстойно для чтения кода.
С одной стороны `` выглядят тут не хуже, но если привык к конструкциям $(), то чтоб не мешать их в одном скрипте - мы можем просто опустить внешние кавычки, они ж по факту тут нафиг не нужны :hoho: то есть
settings[$i]=$(echo "раз,два,три,четыре,пять"| awk -F "," "{print $print_number}") будет выглядеть уже не так кошмарно
Изображение
   
Изображение

Аватара пользователя

Автор темы
root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

Подстановка в awk print $*

#11

31 авг 2018, 21:13

Chocobo, как ты заметил
Chocobo писал(а):
31 авг 2018, 20:15
баш - коварная штука)
:-D
Хех, помню у меня прикол был, когда я долго ломал голову, почему же условие в скрипте не работает, вроде все логично. Психанул, переписал под простейшее условие такого вида: if [ 0 = 0 ]; then echo 1; fi. И все равно не работало! Сильно ж у меня тогда бомбило, благо догадался в libre запихать и посмотреть невидимые символы, действительно, перед then стаяла какая-то невидимая фигня. Занес в cherrytree :smile: Сверху неработающий код, снизу - работающий
one_montage.png
one_montage.png (9.56 КБ) 831 просмотр
:-D

Но в целом, думаю, если попрактиковаться, подобные нюансы быстро отложатся в голове, и кучи проблем и вопросов возникать не будет)
Вы не готовы! :pc2:
Изображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3010 раз
Контактная информация:

Подстановка в awk print $*

#12

31 авг 2018, 21:55

root, А за сам алгоритм конструкции если продолжить. Что он делает в двух словах.
из исходной строки заполнить массив, только элементами начиная с 4 до 14. Может нафиг циклы и авк?

Код: Выделить всё

# Входные данные
string="раз,два,три,четыре,пять,шесть,семь,восемь,девять,десять,одиннадцать, двенадцать, тринадцать, четрынадцать, пятнадцать"

# Преобразование строки в массив по разделителю запятой
array=(${string//,/ })

# Выборка только интересующих элементов уже из массива (11 элементов, начиная с 4-го тут)
echo "${array[@]: 3:11}"
четыре пять шесть семь восемь девять десять одиннадцать двенадцать тринадцать четрынадцать
Изображение
   
Изображение

Аватара пользователя

Автор темы
root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

Подстановка в awk print $*

#13

01 сен 2018, 05:06

Chocobo, пока что так не сращивает (хотя я знаю, что в приведенном ниже коде для скрипта для КМ "очистки метаданных через mat" есть какая-то ошибка в логике, кою я чуть позже исправлю), но пока что это выглядит так:
mat_montage.png
т.е. пока цикл используется еще и для подстановки параметров find по i-му элементу (точнее условие в цикле пусто, но планируется его так использовать).

Твой метод весьма интересен, нужно взять на заметку на будущее :thumbs:
Вы не готовы! :pc2:
Изображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3010 раз
Контактная информация:

Подстановка в awk print $*

#14

01 сен 2018, 07:06

root, с этого листинга не видно, чем является $settings_for_folders.
Ну да и ладно, тебе видней как оно там уместней, свои "бест практисес" навязывать не буду :hoho:
Изображение
   
Изображение

Аватара пользователя

Автор темы
root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

Подстановка в awk print $*

#15

01 сен 2018, 10:02

Chocobo, может и применю, скорее всего. Только я бы добавил так:
string_t=${string/раз,два,три,}
array=(${string_t//,/ })

чтобы не забивать лишними значениями)
Вы не готовы! :pc2:
Изображение

Закрыто

Вернуться в «Программирование, скриптинг, виртуализация»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей