ids.txt
다음과 같은 여러 항목이 포함된 파일이 있다고 가정해 보겠습니다 .
foo
bar
bam
...
예를 들어. foo_1.gz
, foo_2.gz
, bar_1.gz
, bar_2.gz
... 등과 같이 파일 이름에 ID가 포함된 특정 파일에 대해 명령을 실행하기 위해 이것을 입력으로 사용하고 싶습니다.
{}
다음과 같은 다른 명령과 함께 사용되는 것을 보았기 때문에 입력을 인용해 보았습니다 .
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
또는 쉘 루프를 사용하십시오.
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