約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
。