我有一个这样的数据作为例子
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