3

3 つのファイルを比較して、ファイル内の情報がどの程度同じかを確認したいと考えています。ファイル形式は次のようなものです。

Chr11   447     .       A       C       74      .       DP=22;AF1=1;CI95=1,1;DP4=0,0,9,8;MQ=15;FQ=-78   GT:PL:GQ        1/1:107,51,0:99
Chr10   449     .       G       C       35      .       DP=26;AF1=0.5;CI95=0.5,0.5;DP4=5,0,7,8;MQ=20;FQ=11.3;PV4=0.055,0.0083,0.028,1   GT:PL:GQ        0/1:65,0,38:41
Chr12   517     .       G       A       222     .       DP=122;AF1=1;CI95=1,1;DP4=0,0,77,40;MQ=23;FQ=-282       GT:PL:GQ        1/1:255,255,0:99
Chr10   761     .       G       A       41      .       DP=93;AF1=0.5;CI95=0.5,0.5;DP4=11,34,6,35;MQ=19;FQ=44;PV4=0.29,1.8e-35,1,1      GT:PL:GQ        0/1:71,0,116:74

私は最初の 2 つの列にのみ関心があります (最初の 2 つの列が同じであれば、等しいと見なします)。これは、2 つのファイルを比較するために使用するコマンドです。

awk 'FILENAME==ARGV[1] {pair[$1 " " $2]; next} ($1 " " $2 in pair)'  file1 file2 | wc -l

私のファイルは非常に大きく、awkはそれらを非常にうまく処理するので、awkコマンドを使用したいと思います! しかし、3つのファイルに使用する方法がわかりませんでした!

4

4 に答える 4

3

3つのファイルすべてに共通するペア(column1 + column2)を単純に印刷し、ペアがファイル内で一意であるという事実を利用する場合は、次のように行うことができます。

awk '{print $1" "$2}' a b c | sort | uniq -c | awk '{if ($1==3){print $2" "$3}}'

これは、最後のコマンドのパラメーターを変更する限り、任意の数のファイルで作成できます。

これが何をするかです:

  1. すべてのファイルの最初の2列を印刷して並べ替えます(awk '{print $1" "$2}' a b c | sort
  2. 重複エントリの数を数える(uniq -c
  3. 重複エントリ数==ファイル数の場合、一致するものが見つかりました。それを印刷します。

.bashrcこれを頻繁に行う場合は、ファイル数をパラメーター化するbash関数として表現できます(そして、にドロップします)。

function common_pairs { 
    awk '{print $1" "$2}' $@ | sort | uniq -c | awk -v numf=$# '{if ($1==numf){print $2" "$3}}'; 
}

必要な数のファイルで呼び出します。common_pairs file1 file2 file3 fileN

于 2011-11-01T10:35:17.503 に答える
3

これには、コマンドcutsort、およびcommを使用します。

  1. カットでは不要なフィールドを切り取ります。

  2. commはソートされた入力を想定しているため、結果をソートします。

  3. commを使用して、file1 と file2 にある行を取得します。

  4. commを再度使用して、file3 にもある行を取得します。

スクリプトは次のようになります。

 for i in 1 2 3
  do
   # options to cut may have to be adjusted for your input files
   cut -c1-15 file$i | sort > tmp.$i
  done

 comm -12 tmp.1 tmp.2   > tmp.1+2
 comm -12 tmp.3 tmp.1+2 > tmp.1+2+3

(もちろん、拡張シェル構文を使用して一時ファイルを回避することもできますが、複雑な構文式の背後にあるアイデアを隠したくありません)

ファイルtmp.1+2+3では、3 つのファイルすべてにキーが存在するはずです。行全体に関心がある場合は、コマンドjoinを 3 つの入力ファイルのソート済みバージョンと組み合わせて使用​​できます)。

于 2011-11-01T10:15:12.417 に答える
3

最後のコメントを読んでください-ファイルを結合したいのですが、重複を削除しますか?

 sort file1 file2 file3 | uniq > newfile
于 2011-11-01T10:20:25.300 に答える
3

エディタ戦争を開始するつもりはありませんが、私は VI に精通しており、vimdiff とその変種は、複数のファイルを並列ビューで比較できます。これは非常に便利だと思います。単にあなたはそれを呼び出すことができます

$ vimdiff <filelist>
于 2014-02-06T05:40:45.497 に答える