入力ファイルは次のとおりです。
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
式は次のとおりです。^chr4
chr4(1つ以上の空白文字)で始まる行は、3から7の範囲の単一の数字と一致します。\s\+
[3-7]
おそらくもっと便利なのは、一致するのではなくできるだけ多くの行を使用またはhead
提供することです(最初の列と一致するにはgrepのみを使用してください)。tail
grep
grep -e '^chr4\s\+' input| tail -n +3| head -n 5
grep
で始まる行と一致して、chr4
行tail
3から始まる行を提供し、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
必要な出力が含まれます。各クロモンを独自のファイルに入れるように変更することもできます。