답변:
for file in xyz*
do
./transeq "$file" "${file}.faa" -table 11
done
이것은 현재 디렉토리에서 for
시작하는 모든 파일을 반복 하고 파일 이름을 첫 번째 인수로 사용하고 파일 이름과 ".faa"를 두 번째 인수로 사용하고 그 다음에 "-table 11"을 사용 xyz
하여 ./transeq
프로그램을 호출 하는 간단한 루프입니다. .
"$file".faa
대화식 원 라이너의 일부로 입력하기가 약간 쉬우 며 .faa
인용해야 할 쉘 메타 문자가 포함되어 있지 않으므로 안전 합니다.
xyz*
glob는 .faa 파일도 선택합니다. bash의 경우 shopt -s extglob
( reference )를 실행 한 다음 for file in xyz!(*.faa) ...
.faa 파일이 루프를 통해 전송되지 않도록 제외하십시오.
GNU Parallel 을 설치하면 다음 과 같이 병렬로 수행 할 수 있습니다.
parallel ./transeq {} {}.faa -table 11 ::: xyz*
프로그램이 CPU를 많이 사용하는 경우 속도가 약간 빨라집니다.
bash
명령 행 에서 다음과 같은 작업을 수행 할 수 있습니다 .
printf '%s\n' {1..5025} | xargs -l -I {} -t ./transeq xyz{} xyz{}.faa -table 11
우리는 1에서 5025까지의 정수를 한 줄씩 생성 한 다음 xargs에 하나씩 공급하여 정수를 캡슐화 {}
한 다음 적절한 방식으로 ./transeq 명령 줄에 이식합니다.
중괄호 확장 기능이 없으면 유틸리티를 {n..m}
호출하여 seq
해당 숫자를 생성 할 수 있습니다.
또는 다음을 통해 항상 숫자 생성을 에뮬레이션 할 수 있습니다.
yes | sed -n =\;5025q | xargs ...
for i in {1..5025}; do ./transeq "xyz$i" "xyz$i".faa -table 11; done
생각하고 타이핑하기가 더 쉽습니다. 명령을 실행하기 전에 인쇄하려면을 사용하십시오 set -x
.
for i in
{1..5025}
를 얻는 데 사용 됩니다 . bash로 작성할 수도 있지만 입력하는 것이 더 빠르기 때문에 일반적으로 범위 구문을 사용합니다 . for ((i=1 ; i<=5025 ; i++)); do ./transeq "xyz$i" "xyz$i".faa -table 11; done
{a..b}
코어가 두 개 이상이고 각 호출이 나머지와 독립적으로 실행될 수 있다고 가정하면 병렬 실행으로 속도가 크게 향상됩니다.
이 작업을 수행하는 비교적 간단한 방법은 다음과 같은 -P
매개 변수 를 사용하는 것 xargs
입니다. 예를 들어 4 개의 코어가있는 경우
echo xyz{1..5025} | \
xargs -n 1 -P 4 -I{} /path/to/transeq xyz{} xyz{}.faa -table 11
이 명령 -n 1
은 xargs
각 호출에 대해 목록에서 하나의 인수 만 선택하도록 지시 하고 (기본적으로 많이 전달 함)-P 4
동시에 4 개의 프로세스를 생성 하도록 지시합니다.
IMHO, 당신은이 간단한 경우에 GNU 병렬을 설치할 필요가 없습니다 – xargs
충분합니다.
for file in xyz*; do ./transeq "$file" "${file}.faa" -table 11; done
. 나는 항상 이런 종류의 것을 입력합니다. 당신이 등을 파일 이름, 당신이 원하는 방식으로 확장지고 있는지 확인 싶다면, 그냥 넣어echo
애프터 권리를do
처음으로 다음 쉘 역사에 다시 가서 그에게 두 번째 시간을 삭제합니다.