列の特定のパターンに基づいてデータを抽出する

列の特定のパターンに基づいてデータを抽出する

次のデータセットがあります。

AAACCTGCAAGCGAGT-1,ENSG00000000419,DPM1,2
AAACCTGCAAGCGAGT-1,ENSG00000001497,LAS1L,1
AAACCTGCAAGCGAGT-1,ENSG00000002330,BAD,1
AAACCTGCAAGCGAGT-1,ENSG00000002549,MT-CO3,2
AAACCTGCAAGCGAGT-1,ENSG00000002586,CD99,5
AAACCTGCAAGCGAGT-1,ENSG00000002834,LASP1,1
AAACCTGCAAGCGAGT-1,ENSG00000003056,M6PR,1
AAACCTGCAAGCGAGT-1,ENSG00000003402,MT-CYB,2
AAACCTGCAAGCGAGT-1,ENSG00000004059,ARF5,2
AAACCTGCAAGCGAGT-1,ENSG00000004455,AK2,1
AAACCTGCAAGCGAGT-1,ENSG00000004468,CD38,8
AAACCTGCAAGCGAGT-1,ENSG00000004779,NDUFAB1,3
AAACCTGCAAGCGAGT-1,ENSG00000004975,DVL2,1
AAACCTGCAAGCGAGT-1,ENSG00000005022,SLC25A5,6

私は3番目の列に「MT-」パターンを持つミトコンドリア遺伝子を含むデータを取得したいと思います。たとえば、上記のデータセットから次のものを抽出したいとします。

AAACCTGCAAGCGAGT-1,ENSG00000002549,MT-CO3,2
AAACCTGCAAGCGAGT-1,ENSG00000003402,MT-CYB,2

私は次のコマンドを使用します。

awk '$3 ~/^MT-/ {print $1, $2, $3, $4} final_matrix.csv

しかし、それはうまくいきませんでした。

答え1

デフォルトでは、awkではフィールドをスペースで区切る必要があります。ファイルがコンマで区切られている場合は、コマンド-Fラインオプションを使用するか、内部awk変数を設定してFSフィールド区切り文字を適切に設定する必要があります。

出力をコンマで区切るには、これを設定する必要がありますOFS

前任者。

$ awk -F, 'BEGIN{OFS=FS} $3 ~ /^MT-/ {print $1, $2, $3, $4}' final_matrix.csv
AAACCTGCAAGCGAGT-1,ENSG00000002549,MT-CO3,2
AAACCTGCAAGCGAGT-1,ENSG00000003402,MT-CYB,2

答え2

すべての答えは正確で、行全体を印刷することもできます。

そして、フィールド解析は必要ありません。

awk  '/,MT-/{print}' final_matrix.csv

答え3

アイデアは正確ですが、列項目を残りの列と区別するawkように分離する方法を示すことを忘れました。これで、テキストを区切るための空白だけを探していますが、最終的に行全体を見つけることになりますが、これはまったく見つかりません。したがって、これは単にエラー条件によって引き起こされるものです。$1$2$1$3$3 ~ ..まったく印刷する行数。

awk -v FS=, -v OFS=, '$3 ~/^MT-/ {print $1, $2, $3, $4}' final_matrix.csv

答え4

公開した例を考えると、次のことができます。

grep ',MT-/' final_matrix.csv

しかし、awkを使用して3番目のフィールドに集中するには:

awk -F, '$3 ~ /^MT-/' final_matrix.csv

または:

awk -F, 'index($3,"MT-")==1' final_matrix.csv

関連情報