将文件中的行与其他文件中的标头进行匹配以获得完整的段落

将文件中的行与其他文件中的标头进行匹配以获得完整的段落

我需要有关使用两个文件编写脚本的帮助,其中文件 1 列出了按特定顺序排列的氨基酸(一个在另一个下面,也可能重复),第二个文件 2 构成了每个氨基酸下列出的特征。在这里,我尝试匹配列表一(文件 1)中的氨基酸,以获得第二个文件(文件 2)的相同氨基酸下列出的其特征,并按照与中提到的相同顺序将其复制到输出文件文件 1。

例如文件1.txt

    Threonine
    Glutamine
    Alanine
    Asparatate
    Glutamine
    Alanine
    Threonine

文件2.txt

    [ Alanine ] 
    89.1    13.7    -3.12   -10.09
    [ Asparatate ]  
    133.1   30  -2.43   -10.35
    [ Glutamine ]   
    146.1   42.7    -3.46   -10.23
    [ Threonine ]   
    119.1   28.5    -2.43   -9.99   

我期望的输出如下:output.txt

    [ Threonine ]   
    119.1   28.5    -2.43   -9.99
    [ Glutamine ]   
    146.1   42.7    -3.46   -10.23
    [ Alanine ] 
    89.1    13.7    -3.12   -10.09
    [ Asparatate ]  
    133.1   30  -2.43   -10.35
    [ Glutamine ]   
    146.1   42.7    -3.46   -10.23
    [ Alanine ] 
    89.1    13.7    -3.12   -10.09 
    [ Threonine ]   
    119.1   28.5    -2.43   -9.99

我尝试在 awk 中使用以下脚本,该脚本使用数字作为索引而不是单词,但不适用于此目的。

awk 'FNR==NR { a[ "\\[ " $1 " \\]" ]; next } /^\[/ { f=0 } { for (i in a) if ($0 ~ i) f=1 } f' file1.txt file2.txt > output.txt

我不知道如何修改脚本以使其适用于单词。请告诉我哪里出错了,并帮助我执行脚本以获得所需的输出。

我将非常感谢您的帮助。

提前致谢。

阿莎

答案1

您需要循环遍历酸File1.txt并在 + 1 行中找到匹配行的所有内容File2.txt,这很容易完成grep

for acid in $(sed 's/^\s*//' File1.txt)
do
    grep -FA1 "$acid" File2.txt
done > Output.txt

但如果你喜欢awk

awk '
FNR!=NR{
    print "    [",$1,"]"
    print acids[$1]
    next
}
/\[/{
    acid=$2
    next
}
{
    acids[acid]=$0
}' File2.txt File1.txt > Output.txt

答案2

执行此操作的快速方法是使用:

while read amino_acid
do
    grep -A1 ${amino_acid} File2.txt >> output.txt
done < File1.txt

答案3

xargs/ grep

xargs -n1 -I '{}' grep '{}' -A1 File2.txt <File1.txt

解释:

  • -n1: 强制 xargs 对每一行执行命令
  • -I '{}': 设置占位符
  • grep '{}' -A1 File2.txt:要执行的命令
    • -A1:还打印搜索模式之后的行
    • File2.txt: 搜索槽File2.txt
  • <File1.txt:输入是File1.txt

相关内容