예시로 이런 데이터가 있어요
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
기본적으로 아무것도 인쇄되지 않음을 의미합니다.-e
sed 명령이 이어집니다.s
패턴 교체 명령입니다.- 정규식은 접두사인
^${parts[0]
로 시작하는 줄과 일치합니다${parts[0]
(예: ;sp|O15304|SIVA_HUMAN
). - 예를 들어 일치 항목은
sp|O15304|SIVA_HUMAN
빈 문자열로 대체됩니다. p
변환된 줄이 인쇄됩니다. (변수에 저장됩니다other_text
)
또한보십시오이 자세한 설명은이 특정 sed
명령.
파일에서 출력을 리디렉션하려면 다음과 같이 파일을 매개변수로 설정 하고 지정하여 ./merge.sh > output.txt
스크립트를 더욱 유연하게 만들 수 있습니다 .fileone=$1
filetwo=$2
./merge.sh file1.txt file2.txt