Câu trả lời:
for file in xyz*
do
./transeq "$file" "${file}.faa" -table 11
done
Đây là một for
vòng lặp đơn giản sẽ lặp lại trên mọi tệp bắt đầu xyz
trong thư mục hiện tại và gọi ./transeq
chươ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".faa
dễ 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ì .faa
khô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 bash
dò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 seq
tiệ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; done
là 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; done
bằ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 -P
tham 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 1
kể 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 4
nó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 đặtecho
quyền saudo
lần đầu tiên, sau đó quay lại lịch sử shell của bạn và xóa nó lần thứ hai.