Допустим, у меня есть файл ids.txt с несколькими записями, такими как

foo
bar
bam
...

Например. Я хотел бы использовать это в качестве входных данных для запуска команды для некоторых файлов, содержащих идентификаторы в имени файла, например foo_1.gz, foo_2.gz, bar_1.gz, bar_2.gz,... и так далее.

Я попытался сослаться на ввод с помощью {}, так как увидел, что это работает с другой командой, например так:

cat ids.txt | xargs my.command --input1 {}_1.gz --input2 {}_2.gz 

Но он всегда дает мне эту ошибку:

{}_1.gz no such file or directory

Есть ли способ обрабатывать ввод из cat как строки символов и автоматически вставлять их в имена входных файлов для my.command?

Проблема также в том, что my.command каждый раз требуется два входных файла, поэтому я не могу просто использовать список с реальными именами файлов вместо ids.txt.

1
Jjplow 11 Авг 2020 в 15:37
Судя по именам ваших файлов, я подозреваю, что вас может заинтересовать наш дочерний сайт Bioinformatics.
 – 
terdon
11 Авг 2020 в 16:16

1 ответ

Лучший ответ

Вам нужно использовать опцию -I здесь:

$ cat ids.txt | xargs -I{} echo my.command --input1 {}_1.gz --input2 {}_2.gz 
my.command --input1 foo_1.gz --input2 foo_2.gz
my.command --input1 bar_1.gz --input2 bar_2.gz
my.command --input1 bam_1.gz --input2 bam_2.gz

В качестве альтернативы используйте цикл оболочки:

while read id; do 
    my.command --input1 "${id}"_1.gz --input2 "${id}"_2.gz
done < ids.txt

Это предполагает, что ваши идентификаторы не имеют пробелов или обратной косой черты. Если они могут, используйте это вместо этого:

while IFS= read -r id; do 
    my.command --input1 "${id}"_1.gz --input2 "${id}"_2.gz
done < ids.txt

Наконец, вы также можете использовать список с двумя именами файлов в строке:

$ cat ids.txt
foo_1.gz foo_2.gz
bar_1.gz bar_2.gz
bam_1.gz bam_2.gz

Нво:

while read file1 file2; do
    my.command --input1 "$file1" --input2 "$file2"
done < ids.txt
3
terdon 11 Авг 2020 в 18:16
Большое спасибо за быстрый и подробный ответ! Кажется, это работает с опцией -I! :)
 – 
Jjplow
12 Авг 2020 в 17:11