#bash #awk
#bash #awk
Вопрос:
В середине скрипта bash есть одна строка awk, которая выдает ошибку, и я не знаю, как ее исправить.
Вот упрощенный пример:
#!/bin/bash
filename=$(find -L . | grep file.txt.gz | awk '{printf "<(gunzip -c %s)", $1}' )
awk '{print $1}' ${filename}
При запуске этого скрипта я получил следующие сообщения об ошибках:
find -L .
grep file.txt.gz
awk '{printf "<(gunzip -c %s)", $1}'
filename='<(gunzip -c ./file.txt.gz)'
awk '{print $1}' '<(gunzip' -c './file.txt.gz)'
awk: fatal: cannot open file `<(gunzip' for reading (No such file or directory)
Проблема возникает из-за дополнительной '
внутренней переменной bash '<(gunzip' -c './file.txt.gz)'
, но я не знаю, откуда '
она берется?
Любые предложения были бы полезны.
Комментарии:
1. Вы пытаетесь сделать что-то вроде
find -L . -name 'file.txt.gz' -exec gunzip -c {} | awk '{print $1}'
?2. @oguzismail Не совсем, я пытаюсь заставить awk принимать как txt, так и txt.gz файл в одну строку. Я не публиковал полный сценарий, поэтому это может сбить с толку.
3. Мне кажется, что логика выполнения вообще не звучит. Подход @oguzismail кажется намного более логичным
Ответ №1:
Со страницы руководства awk:
-v var=val --assign var=val Assign the value val to the variable var, before execution of the program begins.
Следовательно, если вы вызываете свою программу awk с помощью
awk -v P1="$1" '{printf "<(gunzip -c %s)", P1}'
вы должны получить желаемый эффект.
Комментарии:
1. К сожалению, это не решает проблему.
2. В каком отношении?
3. @theronless: вот доказательство концепции , демонстрирующее передачу параметра.
4. $ 1 inline должен выводиться из grep, а не из переменной bash.
5. Возможно, это помогло бы, если бы вы описали, что должен делать ваш скрипт.