約500の遺伝子名を持つ1つの列のみをgenelist.txt
含むdata.txt
2つのファイルがありますが、タブ区切りファイルには約1000の列(サンプル)と約30,000の行(遺伝子名)が含まれています。プログラム全体を以下に説明する。genelist.txt
data.txt
data.txt
Sample 1 Sample 2 Sample 3 Sample 4 Gene A 1.04 1.81 1.92 0.45 Gene B 1.11 1.12 1.32 0.92 Gene C 0.72 0.71 0.85 1.12 Gene D 1.19 1.42 0.13 0.32
data.txt
約500個の遺伝子名のそれぞれから各行(すべての行、つまりすべてのサンプル)を抽出し、genelist.txt
これらの行を別々のファイルに抽出する必要があります。 grepやawkを使うように言われてこれを行う方法を調べましたが、コーディングの経験がほとんどない単純な生物学者として、少し難しさがあります。誰かがこれがどのように行われるかを説明し始めるために必要ないくつかのコードを提供できますか?
抽出がの完全な遺伝子名と一致する用語だけを返すとよいでしょうgenelist.txt
。たとえば、私が持っている場合ABC123しかし、ABC1234、genelist.txt
私はほしいだけABC123抽出されたものではなく抽出されたものABC1234。
また、これを行った後、genelist.txt
抽出に含まれていない遺伝子をどのように確認できますか? (つまり、一部の遺伝子の名前が間違っている可能性があるため、戻って代替名および/または正しい名前を使用して再抽出する必要があります。)
答え1
data.txt
以下にリストされた遺伝子から行を抽出するにはgenelist.txt
:
grep -w -F -f genelist.txt data.txt > newdata.txt
grep
使用されたオプション:
-w
単語全体に一致するように指示しますgrep
(つまり、ABC123
どちらも一致しませんABC1234
)。-F
正規表現の代わりに固定文字列(プレーンテキスト)を検索する-f genelist.txt
ファイルから検索パターンを読む
ヘッダ行も必要な場合(例1、例2など):
grep -w -F -f genelist.txt -e Sample data.txt > newdata.txt
-e Sample
「サンプル」を検索することもできます。
genelist.txt
存在しない行を見つけるには、次のようにしますnewdata.txt
。
grep -v -w -F -f <(sed -E -e 's/(\t| +).*//' newdata.txt) genelist.txt
-v
検索を逆にして一致しない行を印刷します。
残りのgrepオプションは同じですが、そのオプションを含むファイルを使用する代わりに、-f
次のファイルを使用します。プロセスの交換(望むより返品)、これにより実際のファイルの代わりにコマンドを使用できます。このコマンドで生成されたすべての出力は、「ファイル」の内容と見なされます。
sed -E -e 's/(\t| +).*//' newdata.txt
この例では、最初のTAB文字または最初に表示される空白ペア内のすべての項目を削除してから、newdata.txtの各行を出力するコマンドを使用します。つまり、最初のフィールド(「遺伝子A」など)です。 a)データがスペースで区切られているかTABで区切られているかどうかはわかりません。b)例の最初のフィールドにスペースが含まれているため、TABまたはダブルスペースを使用する必要があります。
sed
使用されたオプション:
-E
(
拡張正規表現を使用すると、一般的な、およびを使用できます。これは)
、でエスケープするよりも+
読みやすくなります。\
\(
\)
\+
-e 's/(\t| +).*//'
入力に適用する sed スクリプト (newdata.txt) を指定します。
例でこのコマンドを実行すると、data.txt
次の出力が生成されます。
$ sed -E -e 's/(\t| +).*//' data.txt
Gene A
Gene B
Gene C
Gene D
それにもかかわらず、このコマンドの出力はsed
このコマンドの検索パターンのリストとして使用されますgrep
。
答え2
あなたの質問に対する実際の答え:
fgrep -w -f genelist.txt data.txt >results.txt
fgrep
正規表現ではなく固定文字列を検索する(asgrep
とegrep
do)-w
fgrep
単語全体を一致させるように指示するので、ABC123
一致しません。ABC1234
-f genelist.txt
fgrep
で読み込む検索パターンを教えてくれますgenelist.txt
。
抽出にどの遺伝子がgenelist.txt
含まれていないかを確認することは、より複雑です。 1つの方法は次のとおりです。
awk '{ print $1 }' results.txt | fgrep -w -v -f - genelist.txt >outsiders.txt
awk '{ print $1 }'
テキストファイルの最初の列を印刷します。これは一致する遺伝子のリストです。fgrep
固定文字列を再一致します。-w
fgrep
単語全体に一致するように指示します。-v
次の行を印刷するように指示いいえマッチ-f -
パターンリストstdin
、つまり一致する遺伝子のリストを読むように指示しますawk
。
sort -u
検索する前に、一致する遺伝子のリストから重複項目を調停および削除してawk
効率を向上させることもできますfgrep
。
awk '{ print $1 }' results.txt | sort -u | fgrep -w -v -f - genelist.txt >outsiders.txt
答え3
これはLinuxの経験がない人にとっては難しい作業です。しかし、私はあなたが必要とするものを理解していて、あまりにも困難ではないと思います。予めご了承ください。これは非常に基本的な説明を超えて非常に簡潔な短期集中コースです。理解できない場合は、喜んで詳しく説明するか、必要に応じて編集します。
単に解析して.txtdata.txt
に移動したい場合(newfile.txtは他のファイルです。名前は任意です)genelist.txt
cat data.txt >> genelist.txt newfile.txt
特定の名前の行を印刷するには、cat data.txt | grep ABCD123 >> genelist.txt newfile.txt
ABCD123 を使用して希望の名前に変更できます。
このコマンドはgrepを使用して見つかった行のみを出力します(「検索」機能と似ていますが、行ごとにのみ検索します。)
"|"はパイプと呼ばれ、"grep"コマンドと一緒に使用すると、探しているものをフィルタリングするフィルタと同じ役割を果たします。 (cat zoofile.txt | grep pandas
たとえば、ファイル名が「zoofile」の「pandas」という単語を含むすべての行を検索します。Linuxは大文字と小文字を区別し、入力したもののみを正確に検索します。 pand *を使用できます。ここで、*はワイルドカードで、長さは0から255ビットの間の文字にすることができます。
もっとエキゾチックな列解析にawkを使用できますが(私のお気に入りのツールの1つです!)、いくつかのパラメータに基づいて列の1つだけのデータが必要ない限り、これには適していないようです。
最後に、ここはいくつかのコマンドラインの知識を学ぶのに最適な場所です。これはgrepには役立ちますが、awkには役立ちません。
https://www.codecademy.com/learn/learn-the-command-line
後でawkについて詳しく説明します。 awkには非常に幅広いコースがたくさんありますが、そのコースで迷子になりやすいです。これはあなたがやりたいことをもっと見せる実用的なウェブサイトです。
https://www.ibm.com/developerworks/library/l-awk1/
編集 - もう一度読んだ後に何かを逃した可能性があります。 2つのファイルを比較し、他のファイルと一致するファイルの内容のみを印刷しますか?提案と例を提供してください。それに応じて答えを修正します。