Câu trả lời:
for file in xyz*
do
./transeq "$file" "${file}.faa" -table 11
done
Đây là một forvòng lặp đơn giản sẽ lặp lại trên mọi tệp bắt đầu xyztrong thư mục hiện tại và gọi ./transeqchương trình với tên tệp là đối số đầu tiên, tên tệp theo sau là ".faa" làm đối số thứ hai, theo sau là "-table 11" .
"$file".faadễ dàng hơn một chút để nhập như một phần của một lớp lót tương tác và an toàn vì .faakhông chứa bất kỳ siêu ký tự vỏ nào cần được trích dẫn.
xyz*cầu cũng sẽ nhận các tệp .faa. Đối với bash, hãy chạy shopt -s extglob( tham chiếu ), sau đó sử dụng for file in xyz!(*.faa) ...để loại trừ các tệp .faa khỏi được gửi qua vòng lặp.
Nếu bạn cài đặt GNU Parallel, bạn có thể thực hiện song song như thế này:
parallel ./transeq {} {}.faa -table 11 ::: xyz*
Nếu chương trình của bạn sử dụng nhiều CPU, nó sẽ tăng tốc khá nhanh.
Bạn có thể làm một cái gì đó như thế này trên một bashdòng lệnh:
printf '%s\n' {1..5025} | xargs -l -I {} -t ./transeq xyz{} xyz{}.faa -table 11
Chúng tôi đang tạo các số nguyên từ 1 đến 5025, một / dòng, sau đó cung cấp từng số một cho xargs, đóng gói số nguyên vào {}và sau đó ghép nó vào dòng lệnh ./transeq theo cách thích hợp.
Nếu bạn không có tiện ích mở rộng cú đúp {n..m}thì bạn có thể gọi seqtiện ích để tạo các số đó.
Hoặc, bạn luôn có thể mô phỏng thế hệ số thông qua:
yes | sed -n =\;5025q | xargs ...
for i in {1..5025}; do ./transeq "xyz$i" "xyz$i".faa -table 11; donelà cách dễ dàng hơn để suy nghĩ và loại. Nếu bạn muốn nó in lệnh trước khi thực hiện chúng, hãy sử dụng set -x.
for i in {1..5025}để đạt được kết quả chính xác như của bạn. Bạn cũng có thể viết for ((i=1 ; i<=5025 ; i++)); do ./transeq "xyz$i" "xyz$i".faa -table 11; donebằng bash, nhưng tôi thường sử dụng {a..b}cú pháp phạm vi vì nó nhanh hơn để gõ.
Giả sử bạn có nhiều hơn một lõi và mỗi lệnh gọi có thể chạy độc lập với phần còn lại, bạn sẽ đạt được tốc độ khá nhanh với các lần chạy song song.
Một cách tương đối đơn giản để thực hiện việc này là thông qua -Ptham số của xargs- ví dụ: nếu bạn có 4 lõi:
echo xyz{1..5025} | \
xargs -n 1 -P 4 -I{} /path/to/transeq xyz{} xyz{}.faa -table 11
Các -n 1kể xargsđể chọn chỉ có một lập luận ra khỏi danh sách cho mỗi lời gọi (theo mặc định nó sẽ vượt qua rất nhiều) , và -P 4nói với nó để đẻ trứng 4 quy trình cùng lúc - khi một chết, một cái mới được sinh ra.
IMHO, bạn không cần phải cài đặt song song GNU cho trường hợp đơn giản này - xargsđủ.
for file in xyz*; do ./transeq "$file" "${file}.faa" -table 11; done. Tôi gõ loại này mọi lúc. Và nếu bạn muốn xác minh rằng tên tệp, v.v. đang được mở rộng theo cách bạn muốn, chỉ cần đặtechoquyền saudolần đầu tiên, sau đó quay lại lịch sử shell của bạn và xóa nó lần thứ hai.