以下のファイル(fileA)があります。
>ENST00000614578.1 gene=WASP12 CDS=1-526
>ENST00000581055.1 gene=PTP2 CDS=138-579
>ENST00000577541.1 gene=PTP2 CDS=1-81
>ENST00000423485.5 gene=PTP2 CDS=160-4752
>ENST00000367142.4 gene=PRPF40B CDS=304-1032
>ENST00000366955.7 gene=WASP12 CDS=169-9511
CDS値の範囲が最も大きい行だけを維持したいと思います。範囲は 3 番目の列の CDS 値で指定されます。たとえば、最初の行の範囲は525(526-1)、2番目の行の範囲は441(579-138)です。
希望の出力:
>ENST00000423485.5 gene=PTP2 CDS=160-4752
>ENST00000367142.4 gene=PRPF40B CDS=304-1032
>ENST00000366955.7 gene=WASP12 CDS=169-9511
ソートしてみました。
sort -nrk3,3 fileA
しかし、私はこれが行く道ではないと思います。どんな提案がありますか?フィルタリング基準は、同じ遺伝子名を持つ行の範囲の最大値を取ることです。
ベストアンサー1
新しい情報を見てここに来ました
awk -F'[ =-]' '{ print $0" "$6-$5 | "sort -k4nr" }' fileA | \
cut -d' ' -f1-3 | \
awk -F'[ =]' '!seen[$3]++'
出力:
>ENST00000366955.7 gene=WASP12 CDS=169-9511
>ENST00000423485.5 gene=PTP2 CDS=160-4752
>ENST00000367142.4 gene=PRPF40B CDS=304-1032
これは間違いなく1つのコマンドで行うことができますが、awk
まだ使い方を学んでいます。
OP編集前の以前の回答:
最小値が700(例の出力と一致するように)であると仮定すると、次のことを試すことができます。
awk -F'[=-]' '$4-$3 > 700' fileA
出力:
>ENST00000423485.5 gene=PTP2 CDS=160-4752
>ENST00000367142.4 gene=PRPF40B CDS=304-1032
>ENST00000366955.7 gene=WASP12 CDS=169-9511
-F'[=-]'
:=
とを-
列区切り文字として使用して、列3と4になります。
1 526
138 579
1 81
160 4752
304 1032
169 9511
$4-$3 > 700
:4番目の列から3番目の列を引いた値が700より大きい行を選択します。