forループとgrepを同時に使用しようとすると、空白に少し問題があるようです。たとえば、「k117_196509」ではなく「k117_19650」を一致させようとするため、スペースが重要です。どうぞよろしくお願いします!
for i in 'k117_19650 ' 'k117_460555 ';do
grep -A1 $i final.contigs.fa >> gene.fa
done
答え1
直面している問題は、シェル変数の使用に関連しています。特に、スペースなどの「非標準」文字を含む変数を使用する場合、常に変数を引用してください。これを使用する場合は、ここで議論を参照してください。
- bash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク
- スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか? (これら2つはStéphane Chazelasの提案に基づいています)
- スタックオーバーフロー時またはここ。
あなたの場合:
grep -A1 -- "$i" final.contigs.fa >> gene.fa
トリックを実行する必要があります(で始まる値を--
避けるためにここに1つを追加してください)。$i
-
答え2
これを区別するには(「k117_19650」と一致しますが「k117_196509」と一致しません)、whichを使用して部分文字列の代わりに単語全体を検索させることができ-w
ますgrep
。
for i in k117_19650 k117_460555 ;do
grep -w -A1 "$i" final.contigs.fa >> gene.fa
done