여러 줄이 포함된 텍스트 파일이 있는데 그 중 일부는 ">"로 시작합니다(이것은 소위 *.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-/"