여러 파일의 행을 하나의 파일로 복사하고 해당 행의 이름을 원본 파일 이름으로 지정하는 방법

여러 파일의 행을 하나의 파일로 복사하고 해당 행의 이름을 원본 파일 이름으로 지정하는 방법

내 문제는 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옵션을 사용해야 합니다.

관련 정보