Такой простой сценарий 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