내가 작업 중인 디렉토리에는 다음 확장자를 가진 두 개의 파일이 있습니다 .sam
.
PD180425_aligned_minimap.sam
PD180793_aligned_minimap.sam
이 두 파일 각각에 대해 다음과 같은 명령을 적용해야 합니다.
samtools view -Sb pattern.sam > pattern.bam
저는 이런 용도로 사용하려고 합니다 xargs
. 내가 원하는 것은 이전 접두사를 캡처 _aligned_minimap
하고 이를 사용하여 내 출력에 저장하는 것입니다. 내가 시도한 것은 다음과 같습니다.
ls *.sam | cut -d "_" -f 1 | xargs -i samtools view -Sb {}_aligned_minimap.sam > {}_aligned_minimap.bam
PD180425_aligned_minimap.bam
ie 및 를 생성해야 합니다 PD180793_aligned_minimap.bam
. 명령이 실행 중이지만 {}_aligned_minimap.bam
작업 중인 디렉터리에 파일이 생성되는 것을 볼 수 있습니다. 이는 xargs( PD180425
및 )를 사용하여 PD180793
캡처하려는 입력이 ''임을 나타냅니다. 일하지 않아.
어떻게 해야 하나요?
답변1
내가 선호하는 방법은 다음과 같습니다.
for SAM_FILE in *.sam; do
samtools view -Sb "$SAM_FILE" > "${SAM_FILE/sam/bam}"
done
예를 들어 라이너로 만들 수 있습니다.
for SAM_FILE in *.sam; do samtools view -Sb "$SAM_FILE" > "${SAM_FILE/sam/bam}"; done
이는 매개변수 확장을 사용하여 출력 파일 확장자를 변경합니다. https://wiki.bash-hackers.org/syntax/pe
내 생각에는 이 스타일은 나중에 당신이나 다른 사람이 당신의 스크립트를 우연히 발견할 경우 당신이 무엇을 하려는지 명확하게 해줍니다.
답변2
for
내 명령은 약간 수정되었습니다. 루프보다 더 간단하고 간결 하다고 생각합니다 .
ls *.sam | cut -d "_" -f 1 | xargs -I {} bash -c " samtools view -Sb {}_aligned_minimap.sam > {}_aligned_minimap.bam"