Как использовать переменную bash в качестве входного файла awk

#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. Возможно, это помогло бы, если бы вы описали, что должен делать ваш скрипт.