내 문제는 fata 형식의 파일이 200개 있다는 것입니다. 예를 들어:
/User/Bin/bin.0.fa
/User/Bin/bin.1.fa
...
/User/Bin/bin.200.fa
각 .fa 파일에는 뉴클레오티드 문자로 구분된 연속 이름 ID가 포함되어 있습니다.
In /User/Bin/bin.0.fa
>c_000000000001
CGACATTTTCCAACTTATTTTTTCCTGTAGTAAAAATTATTTACATACAAAAAAGGAGCTGTTCACTAATTATTTAGTGC
>c_000000000002
TACAACTCCTTTTTACTATTCTTCTGAATTTGATTTTTCATCCATTTGTTTTTGAGCTTCTTGAACTAATTTATCAAGACTATTATCTTCTACAACTTCATTTTCTTGTCTATCTAATTCATCTGTTAATGTTAATTGCTGATCTTTATCTTCTACATCT CTACCTGAAATTTTAGCTATAGCTACAATCTTTTCTTCATCAGAAGTTCTCATTAATCTAACTCCCATTGTAGCTCTAC
>c_000000000003
AGTTACAGATACATCTGATACATTAATTCTTATAGCAACACCACTTGTATTTATAAGCATTAATTCATCTTCAGATTTACATACTGTTGCACCAACAACTTTACCAGTCTTTTCACTGATTTTGTATGTTATTAAACCAACTCCACCTCTATTTTGTCTC
...
In /User/Bin/bin.1.fa
>c_000000000004
GGATCATCGCTTGTACATCCCAAACCAAAAAAGAATACTGCACTTACAATCAGTTGGATTTGAAACGCGATTTTCATTTTTGGTATATGTTTAAGATTAGCACTTTGTTTCATTGCTTTTGGCTATGAACGATGTTTACGGGGGTGTA
>c_000000000005
GAAAGAAGCGTATTGGTCGGTATAAATACCGCTCAACTAAACGAGCACAAAGCTACCGAAAATTTGGATGAATTGGCTTTTCTGGCCCAAACGGCTGGAGC
>c_000000000006
CGGCACTTATTTGCCCCAGCCCATTTTGGGGGTAGAAATACCCAAGAGCAAGGGAAAGGTTCGCCTTCTGGGTGTGCCTACCGTGGTTGACCGTATGTTGCAAC
...
...
In /User/Bin/bin.200.fa
>c_000000020120
CTCTGCAACTGGATCCCGAAAAGATCCGCAAAGAAAGCGAACCCAAAGAAAAAGTCGATCTGGAGAGCACCGTCGCCCGCAGTCTGGCCACCCT
>c_000000020121
CATCAATCATCTCAAATACTACCGCAACGCAGATTATTCCCAGTGCAATAACAAAACCGACTCCCGCCTCTTTTGTCTGGCCGTA
>c_000000050122
GGTACGCCTCCGGCAGAACAAGGCGGCAACGAACCTCAGAACGAGGGAAAGCTAACCCAGGCCGGGTACGCCTCCGGCAGAACAAGGCGGCAACGAACCTCAGAACGAGGGAAAGCTAACCCAGGCCG
...
특정 .fa 파일의 각 contig 이름 ID(">" 제외)를 단일 탭으로 구분된 txt 파일로 복사하고 싶습니다. 여기서 contig 이름 ID의 이름은 원본 파일 n+1로 지정됩니다. 이와 같이:
In /User/Bin/Summary.txt
c_000000000001 Bin_1
c_000000000002 Bin_1
c_000000000003 Bin_1
...
c_000000000004 Bin_2
c_000000000005 Bin_2
c_000000000006 Bin_2
...
...
c_000000020120 Bin_201
c_000000020121 Bin_201
c_000000020122 Bin_201
답변1
게시한 입력/출력 예제와 허용된 답변을 고려하면 실제로 필요한 것은 ARGIND에 GNU awk를 사용하는 것뿐입니다.
awk -F'>' -v OFS='\t' 'NF>1{print $2, "Bin_"ARGIND}' /Usr/Bin/bin*.fa > /User/Bin/Summary.txt
또는 awk를 사용하십시오.
awk -F'>' -v OFS='\t' 'FNR==1{++c} NF>1{print $2, "Bin_"c}' /Usr/Bin/bin*.fa > /User/Bin/Summary.txt
답변2
#!/usr/bin/env python
import os
files = os.listdir('/User/Bin')
for file in files:
fi = open(file, 'r')
n = file.split('.')[1]
for line in fi:
line = line.strip()
if line.startswith('>'):
bins = 'Bin_' + n
print("%s\t%s" % (line[1:], bins))
fi.close()
Linux를 사용하는 한 Python이 설치되어 있을 것입니다. 이것은 효과가 있을 수 있습니다.
답변3
이를 수행할 수 있는 명령은 다음과 같습니다.
grep "^>" /User/Bin/*.fa | awk -F ":>|\\." '{sub(".*/", "", $1);printf "%s\t%s_%d\n",$4,$1,$2+1}'
단계를 설명하겠습니다
grep "^>" /User/Bin/*.fa
위 명령은 원하는 패턴이 있는 행만 파악하고 그에 따라 파일 이름을 인쇄합니다. awk를 사용하여 일치하는 행을 인쇄할 수도 있지만 grep을 사용하면 파일 이름에 필요한 작업을 더 쉽게 수행할 수 있습니다.
awk -F ":>|\\."
이렇게 하면 ":>" 문자 또는 "."이 필드 구분 기호로 작동하여 grep의 출력이 4개 부분으로 분할됩니다. 1. 파일 이름 최대 첫 번째 "." 2. 인덱스 이름 3. 확장자 4. 실제 grep 모델
{sub(".*/", "", $1)
위 단계에서는 파일 이름의 첫 번째 부분에서 기본 이름을 제거합니다.
printf "%s\t%s.%d\n",$4,$1,$2+1}
필요에 따라 두 번째 부분이 1씩 증가하고 탭 구분을 위해 탭이 삽입되는 최종 인쇄를 수행합니다.
답변4
대체 awk
grep
조합
grep -Eo "c_[0-9]+" *.fa | awk -F'[.:]' '{print $4,"Bin_"$2+1}' | column -t
또는
grep -Eo "c_[0-9]+" *.fa | awk -F'[.:]' 'BEGIN{OFS="\t"}{print $4,"Bin_"$2+1}'
또는 항상 "bin..."이 아닌 경우
grep -Eo "c_[0-9]+" *.fa | awk -F'[.:]' 'BEGIN{OFS="\t"}{print $4,toupper(substr($1,1,1))substr($1,2)"_"$2+1}'
grep
입력 파일이 1개만 있으면 이 사용이 실패합니다. 이 경우 이 -H
옵션을 사용해야 합니다.