for 루프를 사용하여 스크립트 출력을 단일 파일로 저장하는 방법

for 루프를 사용하여 스크립트 출력을 단일 파일로 저장하는 방법

다음과 같이 fasta 파일에서 무작위로 200개의 시퀀스를 빼는 데 도움을 받았습니다.

JQ086372.1 장내세균 파지 HK446, 완전한 게놈 ATGGCAGATAACGAATCCGTTCCGACAGTTCGGCGGCAGCGGTTCAGGCCATGAAAAAATGCAGCTGTGG CTTCCCGCTTCAGTCTGCCAATATGGATGTGAAACTCGTCGGAAAAAAAGTGGTTTATCGCTATCAACGCAACAGCGAATACCCGACTTTTCGCAGAAAGAGATTTTTCACCTTAAA GGCTTCGGATTCACCGGGC TTG TAGGCCTGTC... (이것은 여전히 ​​더 많은 A, C, G 또는 T에 적용됩니다.)

이것을 사용하십시오 :

< file.fasta tail -n+2 | tr -d '\n' > newfile

이:

n=$(stat -c "%s" newfile)
r=$(shuf -i1-"$((n-200+1))" -n1)
< newfile tail -c+"$r" | head -c200

내가 얻는 결과는 다음과 같습니다.

이제 .fa로 끝나는 여러 파일과 함께 이 스크립트를 사용하고 for 루프를 사용하여 각 파일의 무작위 200개 하위 문자열 출력을 새 파일에 저장하고 싶습니다. 이는 다음과 같은 3개의 .fa 파일이 있는 경우를 의미합니다. game.fa sport.fa food.fa

각 .fa 파일에서 무작위로 200개의 하위 문자열을 생성하고 200개의 하위 문자열 출력만 포함하는 새 파일을 생성하겠습니다.

game_200_subtring.fa sport_200_substring.fa food_200_substring.fa

아마 아주 기본적인 내용일 테니 미리 감사드립니다.

인용하다:fasta 파일에서 임의의 200자 하위 문자열을 추출하는 방법

답변1

원하는 대로 작동해야 합니다. 스크립트 자체에 사용법 정보를 포함시켰습니다. 참고: 소스 파일에 액세스할 수 없기 때문에 이 스크립트의 출력을 안정적으로 테스트할 수는 없습니다.~해야 한다일하다.

이는 단순히 스크립트가 실행되는 디렉터리의 ".fa" 파일을 반복하고 각 파일에 제공한 스크립트를 실행하여 "output"이라는 하위 디렉터리에 각 파일에 대한 새 파일을 생성합니다.

#!/bin/bash
# Usage:
# Run this script from within the same directory as the .fa files.
# A subdirectory named 'output' will be created, in which every
# input file will have a corresponding output file, prefixed with 'seq.'
mkdir -p ./output
shopt -s nullglob
for f in *.fa
do
    nf="./output/seq.$f"
    echo "Copying sequence from '$f' to '$nf'"
    
    < $f tail -n+2 | tr -d '\n' > $nf

    n="$(stat -c "%s" $nf)"

    r="$(shuf -i1-"$((n-200+1))" -n1)"

    < $nf tail -c+"$r" | head -c200
done

답변2

기존 단일 파일 코드를 함수에 넣습니다.

random_sample() {
    local fasta_file=$1
    local n r tmp sample
    tmp=$(mktemp)
    < "$fasta_file" tail -n+2 | tr -d '\n' > "$tmp"
    n=$(stat -c "%s" "$tmp")
    r=$(shuf -i1-"$((n-200+1))" -n1)
    sample=$(tail -c+"$r" < "$tmp" | head -c200)
    rm "$tmp"
    printf "%s\n" "$sample"
}

그럼 당신은 할 수 있습니다

for file in *.fa; do
    random_sample "$file" > "${file%.fa}_200_substring.fa"
done

fasta 파일이 그다지 크지 않으면 tmp 파일을 사용하지 않습니다.

random_sample() {
    local fasta_file=$1
    local data n r
    data=$(tail -n+2 < "$fasta_file" | tr -d '\n')
    n=${#data}
    r=$(shuf -i1-"$((n-200+1))" -n1)
    tail -c+"$r" <<< "$data" | head -c200
}

파일 < 32767바이트인 경우

random_sample() {
    local fasta_file=$1
    local data
    data=$(tail -n+2 < "$fasta_file" | tr -d '\n')
    echo "${data:($RANDOM % ${#data}):200}"
}

관련 정보