비슷한 문자열로 두 개의 txt 파일을 병합하는 방법

비슷한 문자열로 두 개의 txt 파일을 병합하는 방법

예시로 이런 데이터가 있어요

sp|O15304|SIVA_HUMAN    MPKRSCPFADVAPLQLKVRVSQRELSRGVCAERYSQEVFEKTKRLLFLGAQAYLDHVWDEGCAVVHLPESPKPGPTGAPRAARGQMLIGPDGRLIRSLGQASEADPSGVASIACSSCVRAVDGKAVCGQCERALCGQCVRTCWGCGSVACTLCGLVDCSDMYEKVLCTSCAMFET 
tr|A0A1B1L9R9|A0A1B1L9R9_BACTU  MNKQLFLASLKETQKSILSYACGAALYLWLLIWIFPSMVSAKGLNELIAAMPDSVKKIVGMESPIQNVMDFLAGEYYSLLFIIILTIFCVTVATHLIARHVDKGAMAYLLATPVSRVQIAITQATVLILGLLIIVSVTYVAGLVGAEWFLQDNNLNKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWMKNLSLFTLFRPKEIAEGAYNIWPVSIGLIAGALCIFIVAIVVFKKRDLPL 

아래와 같은 문자열이 있는 또 다른 데이터가 있습니다.

tr|A0A1B1L9R9|A0A1B1L9R9_BACTU This is just an example 1-20-100

나는 이 두 데이터를 일치시키고 첫 번째 테스트에서 두 번째 txt의 비슷한 문자열이 있는 두 번째 텍스트 파일에 섹션을 붙여넣을 수 있기를 원합니다. 예를 들어.

첫 번째 데이터에는 이것이 있습니다.

sp|O15304|SIVA_HUMAN
tr|A0A1B1L9R9|A0A1B1L9R9_BACTU

두 번째 데이터에는 첫 번째 데이터 중 하나와 일치하는 것만 있습니다.

tr|A0A1B1L9R9|A0A1B1L9R9_BACTU

그러면 출력은 다음과 같을 것입니다.

sp|O15304|SIVA_HUMAN    MPKRSCPFADVAPLQLKVRVSQRELSRGVCAERYSQEVFEKTKRLLFLGAQAYLDHVWDEGCAVVHLPESPKPGPTGAPRAARGQMLIGPDGRLIRSLGQASEADPSGVASIACSSCVRAVDGKAVCGQCERALCGQCVRTCWGCGSVACTLCGLVDCSDMYEKVLCTSCAMFET 
tr|A0A1B1L9R9|A0A1B1L9R9_BACTU This is just an example 1-20-100 MNKQLFLASLKETQKSILSYACGAALYLWLLIWIFPSMVSAKGLNELIAAMPDSVKKIVGMESPIQNVMDFLAGEYYSLLFIIILTIFCVTVATHLIARHVDKGAMAYLLATPVSRVQIAITQATVLILGLLIIVSVTYVAGLVGAEWFLQDNNLNKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWMKNLSLFTLFRPKEIAEGAYNIWPVSIGLIAGALCIFIVAIVVFKKRDLPL 

답변1

이와 같은 간단한 Bash 스크립트는 작동하지만 더 짧은 방법도 있을 수 있습니다.

file1.txt:

sp|O15304|SIVA_HUMAN    MPKRSCPFADVAPLQLKVRVSQRELSRGVCAERYSQEVFEKTKRLLFLGAQAYLDHVWDEGCAVVHLPESPKPGPTGAPRAARGQMLIGPDGRLIRSLGQASEADPSGVASIACSSCVRAVDGKAVCGQCERALCGQCVRTCWGCGSVACTLCGLVDCSDMYEKVLCTSCAMFET 
tr|A0A1B1L9R9|A0A1B1L9R9_BACTU  MNKQLFLASLKETQKSILSYACGAALYLWLLIWIFPSMVSAKGLNELIAAMPDSVKKIVGMESPIQNVMDFLAGEYYSLLFIIILTIFCVTVATHLIARHVDKGAMAYLLATPVSRVQIAITQATVLILGLLIIVSVTYVAGLVGAEWFLQDNNLNKELFLKINIVGGLIFLVVSAYSFFFSCICNDERKALSYSASLTILFFVLDMVGKLSDKLEWMKNLSLFTLFRPKEIAEGAYNIWPVSIGLIAGALCIFIVAIVVFKKRDLPL

file2.txt:

tr|A0A1B1L9R9|A0A1B1L9R9_BACTU This is just an example 1-20-100

merge.sh:

fileone="file1.txt"
filetwo="file2.txt"
IFS=$'\n'
for line in `cat $fileone`; do
    #convert to array
    IFS=' '
    read -ra parts -d '' <<< "$line"

    other_text=$(cat $filetwo | sed -n -e "s/^${parts[0]} //p")
    echo "${parts[0]} $other_text ${parts[1]}"
done

스크립트는 file1.txt한 줄씩 읽은 다음 ${parts[0]}두 번째 파일에 접두사가 포함되어 있는지 확인한 file2.txt다음 문자열을 병합합니다.

작동 원리 sed -n -e "s/^${parts[0]} //p:

  • -n기본적으로 아무것도 인쇄되지 않음을 의미합니다.
  • -esed 명령이 이어집니다.
  • s패턴 교체 명령입니다.
  • 정규식은 접두사인 ^${parts[0]로 시작하는 줄과 일치합니다 ${parts[0](예: ; sp|O15304|SIVA_HUMAN).
  • 예를 들어 일치 항목은 sp|O15304|SIVA_HUMAN빈 문자열로 대체됩니다.
  • p변환된 줄이 인쇄됩니다. (변수에 저장됩니다 other_text)

또한보십시오이 자세한 설명은이 특정 sed명령.

파일에서 출력을 리디렉션하려면 다음과 같이 파일을 매개변수로 설정 하고 지정하여 ./merge.sh > output.txt스크립트를 더욱 유연하게 만들 수 있습니다 .fileone=$1filetwo=$2./merge.sh file1.txt file2.txt

관련 정보