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

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

入力ファイルは次のとおりです。

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列)でフィルタリングして、より小さなファイルを出力したいと思います。

chr4たとえば、場所3から7までフィルタリングするLinuxコマンド(sed、awk、grepなど)を探しています。希望の最終出力は次のとおりです。

chr4    3    C    435
chr4    4    A    223
chr4    5    T    400
chr4    6    G    300
chr4    7    G    340

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

答え1

潜在的にソートされていない入力ファイルの解決策:

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

答え2

awkそれはおそらくあなたの仕事に最適なツールでしょう。単純なソリューションはすでに提供されているソリューションと似ていますが、実際にはユーザーが指定したパラメータを使用します。

awk '$1=="chr4" && $2>=3 && $2<=7'

awk次のように、コマンドをシェルスクリプトに配置することに関連するより一般的なソリューションを好むことができます。

#!/bin/sh
if [ "$#" -lt 3 ]
then
        echo "Usage:    $0 chromosome low_position high_position"
        exit 1
fi
chr="$1"
lo="$2"
hi="$3"
shift 3
awk -vchromo="$chr" -vpos1="$lo" -v pos2="$hi" '$1==chromo && $2>=pos1 && $2<=pos2' "$@"

3つ未満のパラメータを使用して実行すると、パラメータが何であるかを通知して終了します。それ以外の場合は、最初の3つの引数をシェル変数に保存してから、引数リストの外に移動します。次に、を呼び出してawkシェルawk変数の値を変数に渡します。

次のいずれかの方法で呼び出すことができます。

./myscript chr4 3 7   data

または

./myscript chr4 3 7 < data

または

(他のプロセス)|./myscript chr4 3 7
とにかく出力を>

答え3

grepを使用してこれを行うことができます。

grep -e '^chr4\s\+[3-7]' input

式は次のとおりです。^chr4chr4(1つ以上の空白文字)で始まる行は、3から7の範囲の単一の数字と一致します。\s\+[3-7]

おそらくもっと便利なのは、一致するのではなくできるだけ多くの行を使用またはhead提供することです(最初の列と一致するにはgrepのみを使用してください)。tailgrep

grep -e '^chr4\s\+' input| tail -n +3| head -n 5

grepで始まる行と一致して、chr4tail3から始まる行を提供し、head最初の5行(行3〜7)の制限出力を使用します。

答え4

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

split -p 'chr4    (3|8)' -a 1 my_file output
  • splitファイルを複数の部分に分割する(デフォルトでは逆cat
  • p拡張正規表現「chr4(3|8)」に基づいて分割
  • -a 1単一文字を使用して生成されたファイルにサフィックスを追加する
  • output生成された各ファイルのプレフィックス名。

これで、ファイルにoutputb必要な出力が含まれます。各クロモンを独自のファイルに入れるように変更することもできます。

関連情報