入力ファイルは次のようになります。
chr1 1 G 300
chr1 2 A 500
chr1 3 C 200
chr4 1 T 35
chr4 2 G 400
chr4 3 C 435
chr4 4 A 223
chr4 5 T 400
chr4 6 G 300
chr4 7 G 340
chr4 8 C 400
実際のファイルは大きすぎて処理できないので、特定の範囲内の染色体(列1)と位置(列2)でフィルタリングした小さなファイルを出力したいと思います。
たとえば、位置3から7までchr4
でフィルタリングするLinuxコマンド(sed、awk、grepなど)を探しています。目的の最終出力は次のとおりです。
chr4 3 C 435
chr4 4 A 223
chr4 5 T 400
chr4 6 G 300
chr4 7 G 340
元のファイルを変更したくありません。
ソートされていない可能性のある入力ファイルの解決策:
sort -k1,1 -k2,2n file | awk '$1=="chr4" && $2>2 && $2<8'
出力:
chr4 3 C 435
chr4 4 A 223
chr4 5 T 400
chr4 6 G 300
chr4 7 G 340
入力ファイルがソートされている場合は、以下を使用するだけで十分です。
awk '$1=="chr4" && $2>2 && $2<8' file
これはgrepで実現できます。
grep -e '^chr4\s\+[3-7]' input
ここで、式は次のとおりです。^chr4
chr4で始まる行、\s\+
1つ以上のスペース文字、[3-7]
は3〜7の範囲の1桁に一致します。
おそらくもっと便利なのは、head
と一致させる代わりにtail
またはgrep
を使用して、必要な数の行を提供することです(grepを使用して最初の列と一致させるだけです)。
grep -e '^chr4\s\+' input| tail -n +3| head -n 5
grep
はchr4
で始まる行に一致し、tail
は3行目から始まり、head
を使用して最初の5行(3行目から7行目)に出力を制限します。
split
ユーティリティを使用できます。
split -p 'chr4 (3|8)' -a 1 my_file output
split
ファイルを複数の部分に分割(基本的にはcat
の逆)p
拡張正規表現で分割する 'chr4(3 | 8)'-a 1
作成したファイルに1文字の接尾辞を付けるoutput
は、作成された各ファイルのプレフィックス名ですこれで、ファイルoutputb
に目的の出力が含まれます。これを変更して、各クロモゾンを独自のファイルに配置することもできます。