파일의 헤더를 다른 파일의 줄 목록으로 바꾸기

파일의 헤더를 다른 파일의 줄 목록으로 바꾸기

약 28000개의 시퀀스가 ​​포함된 fasta 파일이 있습니다. 이 시퀀스의 헤더를 다른 파일의 줄 목록으로 바꾸고 싶습니다. 예:

파일 1:

sp|B7UM99|TIR_ECO27
MPIGNLGNNVNGNHLIPPAPP.....
sp|P0ACF8|HNS_ECOLI
MSEALKILNNIRTLRAQ........
sp|P24232|HMP_ECOLI
MLDAQTIATVKATIPLLVET..........

파일 2:

sp|B7UM99|TIR_ECO27OS=Escherichia coli
sp|P0ACF8|HNS_ECOLI=Human
sp|P24232|HMP_ECOLI=Flavohemoprotein

원하는 출력:

sp|B7UM99|TIR_ECO27OS=Escherichia coli
MPIGNLGNNVNGNHLIPPAPP.....
sp|P0ACF8|HNS_ECOLI=Human
MSEALKILNNIRTLRAQ........
sp|P24232|HMP_ECOLI=Flavohemoprotein
MLDAQTIATVKATIPLLVET..........

답변1

다음과 같이 sed 및 Paste 명령을 사용하여 이 작업을 수행할 수 있습니다.

$ sed 's/$/\n/' file2 | paste -d ' ' file1 - | sed 's/^sp.* sp/sp/'
sp|B7UM99|TIR_ECO27OS=Escherichia coli
MPIGNLGNNVNGNHLIPPAPP..... 
sp|P0ACF8|HNS_ECOLI=Human
MSEALKILNNIRTLRAQ........ 
sp|P24232|HMP_ECOLI=Flavohemoprotein
MLDAQTIATVKATIPLLVET.......... 

첫 번째 sed는 각 항목 뒤에 빈 줄을 추가하여 붙여넣을 짧은 파일을 준비합니다. 이제 두 파일 모두 동일한 수의 줄과 헤더(이전 및 새)를 가지므로 붙여넣기 명령을 실행합니다. 마지막으로 두 번째 sed는 이전 헤더 텍스트를 제거합니다.

시퀀스 라인에는 후행 공백이 있습니다. 제거가 중요한 경우 결과를 다른 sed로 파이프할 수 있습니다 | sed 's/ $//'.

답변2

GNU를 통해 구현됨 sed:

$ sed -e '/^sp|/{R file2' -e 'd}' file1
sp|B7UM99|TIR_ECO27OS=Escherichia coli
MPIGNLGNNVNGNHLIPPAPP.....
sp|P0ACF8|HNS_ECOLI=Human
MSEALKILNNIRTLRAQ........
sp|P24232|HMP_ECOLI=Flavohemoprotein
MLDAQTIATVKATIPLLVET..........

여기서 R file명령(GNU 비표준 확장)은 file(아니요(표준) 은 패턴 d공간을 버립니다.

-in 위치를 편집하는 옵션이 추가되었습니다 file1 i.

답변3

아마도 다음 스크립트가 필요할 것입니다.

#!/bin/bash

# Save the good lines
awk '{if($0 !~ "^sp")print > "result_1" }' < file_1
awk '{if($0 ~ "^sp")print > "result_2" }' < file_2

# Get number of lines in result_1 ( == nl in result_2 )
nl_file=$(wc -l result_1|cut -d' ' -f1)

# Prepare sorting of these files preceded by a number
seq 2 2 $(( ${nl_file} * 2 )) > numbered_file_1
seq 1 2 $(( ${nl_file} * 2 )) > numbered_file_2

# paste content of numbered_file_* and result_* side by side
paste -d ' ' numbered_file_1 result_1 > mergedfiles
paste -d ' ' numbered_file_2 result_2 >> mergedfiles

sort -n mergedfiles | sed 's/^[[:digit:]]\s\+//g'

답변4

오랜 세월이 지난 후에도 여전히 오래된 질문에 대한 답변이 나오는 것을 보니 반갑습니다!

아마도 awk를 사용하는 것이 훨씬 더 쉬울 것입니다.

$ awk '/sp/{getline nuhead <"file2";$0=nuhead}1' file1
sp|B7UM99|TIR_ECO27OS=Escherichia coli
MPIGNLGNNVNGNHLIPPAPP.....
sp|P0ACF8|HNS_ECOLI=Human
MSEALKILNNIRTLRAQ........
sp|P24232|HMP_ECOLI=Flavohemoprotein
MLDAQTIATVKATIPLLVET..........

관련 정보