일반화하다

일반화하다

여러 줄이 포함된 텍스트 파일이 있는데 그 중 일부는 ">"로 시작합니다(이것은 소위 *.fasta 파일이며 ">"는 새 정보 컨테이너의 시작을 표시합니다).

>header_name1
sequence_info
>header_name2
sequence_info

이 줄이 있는 파일의 이름을 헤더에 추가하고 싶습니다. 예를 들어, 파일 이름이 "1_nc.fasta"인 경우 파일 내에서 >로 시작하는 모든 줄에는 "001"이라는 레이블이 추가되어야 합니다.

>001-header_name1
sequence_info
>001-header_name2
sequence_info

친절한 영혼이 나에게 다음과 같은 대사를 제공했습니다.

sed 's/^>/>001-/g' 1_nc.fasta>001_tagged.fasta 

따라서 2_nc.fasta의 모든 헤더는 "002-", 3_nc.fasta -> "003-" 등으로 시작해야 합니다.

병렬 작업을 스크립트하는 방법을 알고 있지만 작업이 빨리 완료되고 모든 파일을 루프에서 순차적으로 처리하는 스크립트가 훨씬 더 좋다고 생각합니다. 안타깝게도 나 혼자서는 이 일을 할 수 없습니다.

추가된 트위스트: 11_nc.fasta 및 149_nc.fasta를 사용할 수 없습니다.

디렉토리에 있는 500개 파일 전체를 어떻게 반복합니까?

답변1

이것은 트릭을 수행해야합니다. 파일 이름을 밑줄로 나누어 숫자 접두사를 얻은 다음 a를 사용하여 printf세 자리 문자열에 제로 패딩합니다.

for file in *.fasta; do
    prefix="$(printf "%03d" "${file%%_*}")"
    sed  "s/^>/>$prefix-/" "$file" > "${prefix}_tagged.fasta"
done 

답변2

이게 가능할 것 같네요

for f in *.fasta ; do echo sed "s/^>/>$(printf %03d "${f%%_*}")-/" "$f"; done

위와 같이 테스트하여 미리 본 다음 삭제하여 echo콘텐츠를 확인하세요.

for f in *.fasta ; do sed "s/^>/>$(printf %03d "${f%%_*}"-)/" "$f"; done

새 파일을 만들려면 리디렉션을 추가하세요.

for f in * ; do sed "s/^>/>$(printf %03d "${f%%_*}")/" "$f" > "$(printf %03d "${f%%_*}")_tagged.fasta"; done

답변3

이것은 bash에서 작동합니다:

for filename in *.fasta; do
  index="00${filename%_*}"
  addme="${index:((-3)):3}"
  sed "s/^>/>$addme-/g" "$filename" > "$addme"_tagged.fasta
done

비결은 지수를 세 자리로 확장하는 것입니다. 그런 다음 $addme 확장을 허용하려면 ' 대신 "가 필요합니다.

답변4

for n in 000{0..999}; do
   M=${n#???} N=${n##${n%???}}
   [ -f "${M}_nc.fasta" ] && sed -e "s/^>/&$N-/" < "${M}_nc.fasta" > "${N}_tagged.fasta"
done

일반화하다

 n varies from 0000 -> 000999
 M varies from    0 ->    999 strip off the first 3 chars ${n#???}
 N is computed by removing the last 3 chars from n then what remains
   is then stripped , essentially performing the act of padding to 3 digits.

compute the filenames:
   fasda filename = ${M}_nc.fasta <------ input file to sed
   new filename   = ${N}_tagged.fasta <---- output file from sed

   sed command:   "s/^>/&$N-/" 

관련 정보