2つのファイルを使用してスクリプトを作成するのに役立ちます。ファイル1はアミノ酸を特定の順序でリストし(1つは異なる順序で、繰り返すことができます)、2番目のファイル2は各アミノ酸の下にリストされている機能を構成します。ここでは、リスト1(ファイル1)のアミノ酸を一致させて、2番目のファイル(ファイル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
acidを繰り返し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