Использовать содержимое файла в качестве аргумента для программы - PullRequest
2 голосов
/ 05 января 2012

У меня есть файл A с таким содержимым:

/filea
/fileb
/filec
/filed

И у меня есть скрипт xyz.pl, чтобы прочитать один файл и что-то с ним сделать

Теперь я хочу предоставить каждую строку в файле A в качестве аргумента xyz.pl автоматически. Эффективно выполняются следующие команды (в таком порядке)

xyz.pl /filea
xyz.pl /fileb
xyz.pl /filec
xyz.pl /filed

Есть ли какая-нибудь быстрая однострочная команда для этого?

Ответы [ 4 ]

6 голосов
/ 05 января 2012

Используйте xargs с опцией -n

cat A | xargs -n 1 xyz.pl
4 голосов
/ 05 января 2012

Однострочник в баш.

$ for f in `cat A`; do xyz.pl $f; done
1 голос
/ 05 января 2012

Однострочного Perl будет достаточно:

perl -lnwe 'print qx(xyz.pl $_)' fileA.txt

Объяснение:

  • -l - автоматически помечать каждую строку, добавлять новую строку для печати (чтобы избежать несоответствия с новыми строками)
  • -n - неявный while(<>) { .. } цикл вокруг программы
  • qx() - выполнить команду в оболочке и вернуть стандартный вывод

Хотя лучший вариантВне всякого сомнения, нужно изменить ваш скрипт xyz.pl, чтобы он также принимал аргументы в форме стандартного ввода.Трудно сказать, как бы вы это сделали, поскольку я не знаю, как вы обрабатываете аргументы.Тогда это будет простой вопрос:

perl xyz.pl < fileA.txt

Или с некоторыми опциями, например, Getopt :: Long

perl xyz.pl -f fileA.txt    # file as argument
perl xyz.pl /foo            # simple argument
1 голос
/ 05 января 2012

Вы можете использовать xargs.Что нужно сделать, это взять в каждой строке «файла A» (взятого из cat) и выполнить данную команду (xyz.pl) с этими данными в качестве аргумента.

cat 'file A' | xargs -I{} xyz.pl '{}'

Это говорит о том, что{} - это то место, куда должен идти аргумент, и вставляет его после xyz.pl.Это делает его более гибким в случае, если вы захотите изменить команду в будущем.

Обратите внимание, что данное решение будет работать только при условии, что в каждом имени файла нет пробелов.

Редактировать: Подождите, кажется, для меня это работает с пробелами ...

Редактировать: Если это не работает во всех случаях, вотПример:

xyz.pl :

#!/usr/bin/perl
print "Perl processing: $ARGV[0]\n";

one.txt

/filea
/fileb
/filec

Запуск:

$ cat one.txt | xargs -I{} ./xyz.pl '{}'
Perl processing: /filea
Perl processing: /fileb
Perl processing: /filec
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...