基本的なgrep / awkヘルプ - ファイル内の用語のリストを含むすべての行を別々のファイルに抽出します。

基本的なgrep / awkヘルプ - ファイル内の用語のリストを含むすべての行を別々のファイルに抽出します。

約500の遺伝子名を持つ1つの列のみをgenelist.txt含むdata.txt2つのファイルがありますが、タブ区切りファイルには約1000の列(サンプル)と約30,000の行(遺伝子名)が含まれています。プログラム全体を以下に説明する。genelist.txtdata.txtdata.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しかし、ABC1234genelist.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正規表現ではなく固定文字列を検索する(asgrepegrepdo)
  • -wfgrep単語全体を一致させるように指示するので、ABC123一致しません。ABC1234
  • -f genelist.txtfgrepで読み込む検索パターンを教えてくれますgenelist.txt

抽出にどの遺伝子がgenelist.txt含まれていないかを確認することは、より複雑です。 1つの方法は次のとおりです。

awk '{ print $1 }' results.txt | fgrep -w -v -f - genelist.txt >outsiders.txt
  • awk '{ print $1 }'テキストファイルの最初の列を印刷します。これは一致する遺伝子のリストです。
  • fgrep固定文字列を再一致します。
  • -wfgrep単語全体に一致するように指示します。
  • -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.txtcat data.txt >> genelist.txt newfile.txt

特定の名前の行を印刷するには、cat data.txt | grep ABCD123 >> genelist.txt newfile.txtABCD123 を使用して希望の名前に変更できます。

このコマンドは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つのファイルを比較し、他のファイルと一致するファイルの内容のみを印刷しますか?提案と例を提供してください。それに応じて答えを修正します。

関連情報