次のファイルがあります。 12列と3244343行があります。このファイルの名前を1に指定します。
variant_id gene_id tss_distance ma_samples ma_count maf pval_nominal slope slope_se pval_nominal_threshold min_pval_nominal pval_beta
chr10_100000235_C_T_b38 ENSG00000227232.5 35211 73 74 0.061157 1.69779e-08 0.510322 0.0890939 0.0006160191.01823e-08 1.17701e-05
chr10_100002628_A_C_b38 ENSG00000227232.5 635545 126 130 0.107438 1.01823e-08 0.405406 0.0696647 0.0006160191.01823e-08 1.17701e-05
chr1_666028_G_A_b38 ENSG00000227232.5 636475 111 115 0.0950413 2.78462e-08 0.411513 0.0729864 0.0006160191.01823e-08 1.17701e-0
以下に示すように、7つのヘッダーと1633293行の異なるファイルがあります。ファイル2。
"variant_id" "hg38_chr" "hg38_pos" "ref_allele" "alt_allele" "hg19_chr" "hg19_pos"
"chr10_100000235_C_T_b38" "chr10" "100000235" "C" "T" "chr10" 101759992
"chr10_100002628_A_C_b38" "chr10" "100002628" "A" "C" "chr10" 101762385
"chr10_100004827_A_C_b38" "chr10" "100004827" "A" "C" "chr10" 101764584
"chr10_100005358_G_C_b38" "chr10" "100005358" "G" "C" "chr10" 101765115
私はvariant_id
列にのみ興味があります。これは両方のファイルの最初の列です。
variant_id
これら2つの列を比較して最初の列の値のみを印刷する方法2番目のファイルに見つかりません。上記の例では、出力は次のようになります。
chr1_666028_G_A_b38
これは最初のファイルでは見つかりますが、2番目のファイルでは見つかりません。
2番目のファイルのすべての値は、variant_id
最初のファイルにもあります。しかし、最初のファイルには2番目のファイルにはない追加のIDがあり、これらのIDを識別したいと思います。
答え1
システムがサポートしている場合プロセスの交換、フラグ(一致しない行を表示)、フラグ(ファイルからパターンを読み取る)grep
と組み合わせて使用できます。ここで、「file」はファイルの最初のフィールドのみを印刷するコマンドです。たとえば、-v
-f
$ grep -vf <(awk '{print $1}' file2) file1
variant_id gene_id tss_distance ma_samples ma_count maf pval_nominal slope slope_se pval_nominal_threshold min_pval_nominal pval_beta
"chr1_666028_G_A_b38" ENSG00000227232.5 636475 111 115 0.0950413 2.78462e-08 0.411513 0.0729864 0.0006160191.01823e-08 1.17701e-0
これがオプションでない場合は、最初のフィールドをファイルとして印刷し、次のものを使用できます。
$ awk '{print $1}' file2 > file2.names
$ grep -vf file2.names file1
variant_id gene_id tss_distance ma_samples ma_count maf pval_nominal slope slope_se pval_nominal_threshold min_pval_nominal pval_beta
"chr1_666028_G_A_b38" ENSG00000227232.5 636475 111 115 0.0950413 2.78462e-08 0.411513 0.0729864 0.0006160191.01823e-08 1.17701e-0
あるいは、すべてのバリアントIDをfile2に格納するのに十分なRAMがあると仮定すると(非常に古いハードウェアを使用しない限り、これを行う必要があります)、それを使用してファイルのawk
最初のフィールドをすべて別のファイルに保存できます。
$ awk 'NR == FNR{a[$1]++;next}; !($1 in a)' file2 file1
variant_id gene_id tss_distance ma_samples ma_count maf pval_nominal slope slope_se pval_nominal_threshold min_pval_nominal pval_beta
"chr1_666028_G_A_b38" ENSG00000227232.5 636475 111 115 0.0950413 2.78462e-08 0.411513 0.0729864 0.0006160191.01823e-08 1.17701e-0
答え2
まず、両方のファイルを並べ替えます(もちろんヘッダーは除く)。次に、またはawk
を使用してcut
最初の列(ヘッダーを除く)を選択し、手続き型置換を使用して次にない列を選択しますcomm
。file1
file2
comm -23 <(awk 'NR>1 {print $1;}' file1) <(awk 'NR >1 {print $1;}' file2)
プロセス置換[1]のコマンドをスクリプトにリファクタリングすることで、少し簡単にすることができますcol1-nh
(例:「最初の列、タイトルなし」)。
#! /bin/bash
file=$1
awk 'NR>1 {print $1;}' $file
コマンドは次のとおりです。
comm -23 <(col1-nh file1) <(col1-nh file2)
繰り返しますが、これはファイルの本文が次のように見なされます。ソート済み。しかしこれはあり、O(N logN)
両方ですcol1-nh
。comm
ここでO(N)
N は行数なので、言及したサイズのファイルを問題なく処理できる必要があります。提案された各ソリューションにかかる時間を確実に測定する必要があります。
[1] @terdonが呼び出しNR>1
でそれを使用することを提案しましたが、もはや必要ではなく、コマンド自体が十分に単純であると思うかもしれません。awk
sed