条件による部分重複リストのフィルタリング

条件による部分重複リストのフィルタリング

部分的に重複した履歴のリストがあります。各固有レコードは最初の5つのフィールドとして識別されますが、各レコードには後続の4つのフィールドの内容として定義される複数の「属性」が関連付けられています。各レコードの最初のフィールドには「識別子」がありますが、識別子にはそれに関連付けられた複数のレコードがあります。例は次のとおりです。

A   1   122114  A   T   ABCD    c.123A>T    41  K/Y
A   1   122114  A   T   EFGH    c.456-7890T>A   .   .
B   7   56715   G   C   IJKL    c.321+9876C>A   .   .
B   7   56715   G   C   MNOP    c.543G>C    181 Q/L
B   7   56715   G   C   PONM    c.-7324G>C  .   .
C   12  9844    T   C   QRST    c.8392-68723T>C .   .
C   12  3338745 T   C   UVWX    c.599A>G    200 P/*
C   21  71120   C   G   YZAB    c.35C>G 12  D
C   21  71120   C   G   CDEF    c.-2345G>C  .   .
D   1   122114  A   T   ABCD    c.123A>T    41  K/Y
D   1   122114  A   T   EFGH    c.456-7890T>A   .   .
E   8   5094    A   AT  GHIJ    c.678_679insT   226-227 .
E   8   5094    A   AT  KLMN    c.-2356_-2357insT   .   .

条件付き階層を使用して「機能」をフィルタリングして、「レコード」ごとに1行でファイルをフィルタリングしたいと思います。たとえば、次のようになります。

  • フィールド9は「/」を含む。そうでなければ
  • フィールド 9 は [AZ] を含みます。そうでない場合
  • フィールド8には[数字]が含まれています。そうでなければ
  • フィールド7は「[範囲-50~+50][A、C、T又はG]」を含む。

「レコード」がこれらの条件を満たしている場合はもう進まないことを願っています(「レコード」ごとに1つ以上の行を取得するのを防ぐため)。

私はawkを使って最初の5つのフィールドを持つ配列を作成し、forループを実行しようとしましたが、これに対して少しハッシュをしました(申し訳ありません)。

awk -F"\t" '{a[$1$2$3$4$5]=$0;{for (i in a) if ($9~"/") print a[i]; else if ($9~/[A-Z]/) print a[i]; else if ($8~/[0-9]/) print a[i]}}' file

結局何度も印刷されます。 awkでこれを行う方法はありますか?

ベストアンサー1

Perlコード行は次のようになります。

perl -F'\t' -lane '$r{$F[0].$F[1].$F[2].$F[3].$F[4]}=$_ if $F[8]=~/\// or $F[8]=~[A-Z] or $F[7]=~/\d/ or $F[6]=~/\b(\d\d)[ACTG]/ and $1<=50; END{print $r{$_} for (keys %r)}' file

コメント:

perlシステムで使用できると仮定すると、ソリューションが提供されます。awk論理と構文は非常に似ているため、必要に応じて簡単に書き換えることができます。

条件は仕様とawkスニペットに基づいています。コメントですでに指摘したように、そのうちの少なくとも1つは入力ファイルの例と一致しないようです。

これ最後同じキーで見つかったレコードを印刷します。

レコードはランダムな順序で印刷されます。

おすすめ記事