遺伝子リストファイルがあります。このような
SWT21
SSA1
NRP1
EFB1
TFC3
MDM10
リスト内の遺伝子の名前と、そのその他の基本情報を含む別のファイルがあります。 2番目のファイルは次のとおりです。
chrI 147593 151166 YAL001C - TFC3
chrI 143706 147531 YAL002W + VPS8
chrI 142173 143160 YAL003W + EFB1
chrI 140759 141407 YAL004W + YAL004W
chrI 139502 141431 YAL005C - SSA1
chrI 137697 138345 YAL007C - ERP2
chrI 136913 137510 YAL008W + FUN14
chrI 135853 136633 YAL009W + SPO7
chrI 134183 135665 YAL010C - MDM10
最初のファイルの遺伝子名と同じ遺伝子名を持つ2番目のファイルの行を抽出したいと思います。
答え1
必要なのは簡単ですgrep
。
grep -Fwf gene_list.txt gene_info.txt
使用されるオプションは次のとおりです。
- -w : 単語全体を検索します。これは、遺伝子名が
ERK1
遺伝子と一致しないことを保証しますERK12
(-w
標準オプションではありませんが、かなり一般的です)。 - -f:ファイルから検索するパターンを読み込みます。この場合は
gene_list.txt
。 - -F: パターンを正規表現ではなく文字列として扱います。これにより、このような遺伝子名
TOR*
(存在する場合)が一致しなくなりますTORRRRRR
。
注:これは次のように想定されます。スペースなしリスト内の遺伝子名を囲みます。ある場合は、まず削除する必要があります(ここではGNUを使用sed
)。
sed -i 's/ //g' gene_list.txt
答え2
例ではアッウィキ:
awk 'FNR==NR {arr[$0];next} $6 in arr' gene_list info_list
Wikiエントリからコピーされた説明:
FNR == NR
:このテストは、レコード数がファイル内のレコード数と等しい場合に真です。これは最初のファイルでのみ機能し、2番目のファイルの場合、NRはfile1 + FNRの行数に等しくなります。arr[$0]
: これは、行全体に基づいて配列要素インデックスを生成する古典的な手法です。これにより、file1 名を含む配列が作成されます。next
: 次のレコードに移動するため、file1 は処理されなくなりました。$6 in arr
: $1 が arr、つまり file1 に存在する場合、基本操作が実行され、その行が印刷されるため、これは file2 のレコードでのみ発生します。
答え3
さらに堅牢にするには、遺伝子のリストを行の末尾から一致する正規表現に変更できます。これは機能しなければならず、POSIXと互換性があります。
sed 's/[[:space:]]*$/[[:space:]]*$/' gene_list | grep -wf - gene_info
gene_list
または(質問の例に従って)前にスペースを追加します。
sed 's/$/[[:space:]]*$/; s/[[:space:]]//' gene_list |
grep -wf - gene_info
もちろん、遺伝子名に正規表現として解釈される文字が含まれていると機能しません。ただし、この場合は、sed
エスケープするために追加の代替式を追加する必要がありますs:\[:\[:
。
答え4
egrep -wi「遺伝子間誘導パイプラインを含む完全な遺伝子のリスト(1)」「ファイル名にすべての遺伝子を含む(2)」などのコマンドを提供することで、Linuxでgrepコマンドを使用することもできます。ここで、genelist(1) は遺伝子のリストです (番号 20、gene(2)) には遺伝子ファイル全体 (番号 1000) が含まれています。