특정 줄을 연결하고 결과를 새 파일로 출력합니다.

특정 줄을 연결하고 결과를 새 파일로 출력합니다.

다음과 같은 텍스트 파일이 여러 개 있습니다.

파일 1:

>ID_000_FLNNKGHD_01376 
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_MGCDKLCO_02388 
ATGAAGGTGGAAAAAACACCGCTTGCATTT
>ID_000_OMAMOGKP_02746
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA

파일 2:

>ID_000_KGHDAAD_06245 
AAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_KOAAFG_40481 
CCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
>ID_000_GPAAAGVV_07764
--AAATTGGTGG---------ACACCGCTTTT--

등.

각 파일의 첫 번째와 두 번째 줄, 세 번째와 네 번째 줄 등을 연결하고 다음과 같이 각 결과에 대해 새 파일을 출력해야 합니다.

파일 1 출력:

>ID_000_FLNNKGHD_01376-ID_000_KGHDAAD_06245 
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAATAAATACAGAGGAAAAAACACCGCTTGCATACAAT

파일 2 출력:

>ID_000_MGCDKLCO_02388-ID_000_KOAAFG_40481
ATGAAGGTGGAAAAAACACCGCTTGCATTTCCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA

파일 3 출력:

>ID_000_OMAMOGKP_02746-ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA--AAATTGGTGG---------ACACCGCTTTT--

등.

*첫 번째 줄은 ">"로 시작하고 각 문자열 사이에 "-" 연결을 추가해야 합니다. 두 번째 줄은 그냥 합쳐집니다.

출력 이름은 file_1.fasta에서 file_n.fasta로 지정되어야 합니다.

감사해요!

답변1

한 가지 방법은 다음과 같습니다.

paste file1.fa file2.fa | 
    sed -E 's/\s+>/-/; s/\s+//g' | 
        awk -v c=0 '{ if(/^>/){c++} print > "file"c".pasted.fa"; }'

이를 설명하기 위해 각 명령의 출력을 살펴보겠습니다.

$ paste file1.fa file2.fa 
>ID_000_FLNNKGHD_01376  >ID_000_KGHDAAD_06245 
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAAT   AAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_MGCDKLCO_02388  >ID_000_KOAAFG_40481 
ATGAAGGTGGAAAAAACACCGCTTGCATTT  CCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
>ID_000_OMAMOGKP_02746  >ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA    --AAATTGGTGG---------ACACCGCTTTT--

따라서 이것은 각 파일에서 서로 옆에 있는 모든 줄을 인쇄합니다. 파일 1의 라인 1과 파일 2의 라인 1, 파일 1의 라인 2와 파일 2의 라인 2 등입니다. 그러나 여기에는 >제거해야 할 추가 공간과 추가 공간이 있습니다. sed현재 진행 중인 작업은 다음과 같습니다 .

$ paste file1.fa file2.fa | sed -E 's/\s+>/-/; s/\s+//' 
>ID_000_FLNNKGHD_01376-ID_000_KGHDAAD_06245
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAATAAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_MGCDKLCO_02388-ID_000_KOAAFG_40481
ATGAAGGTGGAAAAAACACCGCTTGCATTTCCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
>ID_000_OMAMOGKP_02746-ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA--AAATTGGTGG---------ACACCGCTTTT--

마지막 단계로 awk스크립트는 다음을 수행합니다.

  • awk -v c=0: awk변수를 시작하고 c로 설정합니다 0.
  • if(/^>/){c++}c: 로 시작하는 줄이 발견될 때마다 값을 1씩 증가시킵니다 >.
  • print > "file"c".pasted.fa": 현재 행을 이름이 지정된 파일에 인쇄한 file다음 현재 값을 추가 c합니다 .pasted.fa.

예제 실행의 최종 결과는 다음과 같습니다.

$ ls *pasted*
file1.pasted.fa  file2.pasted.fa  file3.pasted.fa

$ cat file1.pasted.fa 
>ID_000_FLNNKGHD_01376-ID_000_KGHDAAD_06245
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAATAAATACAGAGGAAAAAACACCGCTTGCATACAAT
$ cat file2.pasted.fa 
>ID_000_MGCDKLCO_02388-ID_000_KOAAFG_40481
ATGAAGGTGGAAAAAACACCGCTTGCATTTCCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
$ cat file3.pasted.fa 
>ID_000_OMAMOGKP_02746-ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA--AAATTGGTGG---------ACACCGCTTTT--

관련 정보