
以下のような巨大な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
以下を使用して、awk
4番目の列の形式が正しいことを確認してください。
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 './.' |