약 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
공간을 버립니다.
-i
n 위치를 편집하는 옵션이 추가되었습니다 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..........