web-dev-qa-db-ja.com

列の値に基づいてファイルを行に分割する

入力ファイルは次のようになります。

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

元のファイルを変更したくありません。

2
cooldood3490

ソートされていない可能性のある入力ファイルの解決策:

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
8
RomanPerekhrest

これは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

grepchr4で始まる行に一致し、tailは3行目から始まり、headを使用して最初の5行(3行目から7行目)に出力を制限します。

4
sebasth

splitユーティリティを使用できます。

split -p 'chr4    (3|8)' -a 1 my_file output
  • splitファイルを複数の部分に分割(基本的にはcatの逆)
  • p拡張正規表現で分割する 'chr4(3 | 8)'
  • -a 1作成したファイルに1文字の接尾辞を付ける
  • outputは、作成された各ファイルのプレフィックス名です

これで、ファイルoutputbに目的の出力が含まれます。これを変更して、各クロモゾンを独自のファイルに配置することもできます。

0
gardenhead