如何通过一个相似的字符串合并两个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意味着默认情况下不打印任何内容。
  • -e后面跟着一个 sed 命令。
  • 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

相关内容