假设我有一个ids.txt
包含多个条目的文件,例如
foo
bar
bam
...
例如。我想使用它作为输入来对文件名中包含 ids 的某些文件运行命令,例如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
您需要使用-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
或者,使用 shell 循环:
while read id; do
my.command --input1 "${id}"_1.gz --input2 "${id}"_2.gz
done < ids.txt
这是假设您的 ID 没有空格或反斜杠。如果可以的话,请改用这个:
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