我需要有关使用两个文件编写脚本的帮助,其中文件 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