特定の列のすべての一意の文字列を一覧表示する

特定の列のすべての一意の文字列を一覧表示する

以下のような巨大なvcf.gzファイルに何があるのか​​わかりません。

CHROM       POS         ALT     12345       
1           345632      T       0/1:4,4:8:99:105,0,106
4           032184      C       1/1:46,9:55:99:99,0,1222
6           843290      A       0/1:67,20:87:99:336,0,1641
7           743290      C       0/1:37,20:57:99:336,0,2641
8           329283      T       0/2:99:21:253,0,290:11,10
9           789320      C       2/2:99:21:253,0,290:11,10

すべて抽出したいユニーク":" の前にある 4 番目の列の値です。この場合は次のようになります。

0/1
1/1
0/2
2/2

おすすめメニューとは何ですか?

答え1

以下を使用して、awk4番目の列の形式が正しいことを確認してください。

awk 'match($4, /^[0-9]+\/[0-9]+:/) {
       c = substr($4, RSTART, RLENGTH-1)
       if (!seen[c]++) print c
     }'

答え2

文字で始まる行はコメントまたは無視されると仮定します。

zcat vcf.gz | awk \
   'BEGIN {
        RS = "[\t\v\f ]*(\r\n|\n\r|\r|\n)" ;
        FS = "[\t\v\f ]+"
    }

    /^[A-Za-z]/ {
        next
    }

    NF >= 4 {
        key = $4 ;
        sub(/:.*$/, "", key) ;
        seen[key]++
    }

    END {
        for (key in seen)
            printf "%s\n", key
    }'

\これに必要なすべてのセミコロンを追加したので、コマンド全体を1行に書くことができます(ただし、最初の行の終わりは削除)。

このBEGINルールは汎用改行サポートを設定します。すべての末尾のスペースは無視され、すべての形式の改行(CR、LF、CRLF、LFCR)が改行として許可されます。タブまたはスペースの数はフィールド区切り文字と見なされます。

このルールは、/^[A-Za-z]/文字で始まるすべての行に適用されます。これnextは無視されます。

次の規則は、4つ以上のフィールドを持つすべてのレコード(行)に適用されます。 4番目のフィールドが変数にコピーされ、key最初のコロンの後のすべての内容(および含まれる)が削除されます。結果の値を連想配列のキーとして使用しますseen。私たちが割り当てる値は重要ではありませんが、これにはseen[key]各値が参照される回数(1以上)が含まれます。

ENDすべての入力が処理された後、ルールが実行されます。ここで、ループはseen[]配列のキーを(指定されていない順序で)繰り返し、キーのみを印刷します。

データの順序を維持したりキーに特定の順序を使用したりするには、上記のコードスニペットを少し変更する必要があります。

答え3

perl問題がない場合:

$ perl -lane '($k) = $F[3] =~ m/^([^:]+)/; print $k if !$seen{$k}++ && $. > 1' ip.txt 
0/1
1/1
0/2
2/2
  • ($k) = $F[3] =~ m/^([^:]+)/:列4の前の文字列を取得します。
  • 一意で最初の行ではない場合は印刷します(ヘッダーを避けるため)。


前のパターンがパターンである必要が:ある場合は、digits/digits一致を次に変更します。m|^(\d+/\d+):|

答え4

私は次を使うでしょう:

grep -o -P '.{1}/.{1}' file

あなたの場合:

zcat vcf.gz | grep -o -P '.{1}/.{1}' 

編集:一度だけ発生し、行の末尾にuniqを追加します。

zcat vcf.gz | grep -o -P './.' |

または順番にしたい場合:

zcat vcf.gz | grep -o -P './.' |

関連情報