ファイル名の一部を標準入力の入力に置き換えるには?

ファイル名の一部を標準入力の入力に置き換えるには?

ids.txt次のようないくつかの項目を含むファイルがあるとします。

foo
bar
bam
...

例えば。foo_1.gz、、、...などのように、ファイル名にIDを含む特定のファイルに対してコマンドを実行するためにこれを入力として使用したいと思いますfoo_2.gzbar_1.gzbar_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毎回2つの入力ファイルが必要なため、代わりに実際のファイル名を含むリストを使用できないことです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

またはシェルループを使用してください。

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

最後に、1行に2つのファイル名を含むリストを使用することもできます。

$ 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

関連情報