小数点の後の数字の削除

小数点の後の数字の削除

次のフィールドを含む入力ファイルがあります。

ENST00000456328.2   1657    1350.015    0   0

小数点以下の数字を削除し、残りはそのまま印刷しようとしています。

awk -F[.] '{print $1"\t"$2"\t"$3}{next;}'

ただし、次のような出力が提供されるため動作しません。

ENST00000456328 2   1657    1350    015 0   0

誰でも助けることができますか?

挨拶。

ベストアンサー1

入力がタブで区切られていて、それを保持したい場合は、次のコマンドを使用してEnsembl stable IDからバージョン番号を削除できます。

$ awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $1); print }' file
ENST00000456328 1657    1350.015        0       0

これにより、タブで区切られた最初のフィールドにのみ置換が適用され、最初の点の後のすべての項目が削除されます。

同様に、以下がありますsed

$ sed 's/\.[^[:blank:]]*//' file
ENST00000456328 1657    1350.015        0       0

これにより、各行の最初の点の後の空白以外の文字がすべて削除されます。\.[[:digit:]]*空白以外の数字の代わりに、明示的に数字と一致するasパターンを使用することもできます。

データにバージョン管理されていない Ensembl ID または他のデータベースの ID がある場合は、行を変更する前に、バージョン化された Ensembl ID が一致していることを確認することをお勧めします。の場合、awkこれは次のように実行できます。

$ awk 'BEGIN { OFS=FS="\t" } /^ENS[^[:blank:]]*\./ { sub("\\..*", "", $1) } { print }' file
ENST00000456328 1657    1350.015        0       0

これで、print最初のフィールドを変更したブロックとは異なるブロックになります。これにより、すべての行(変更の有無にかかわらず)が印刷されます。入力時間やスペースが足りない場合は、{ print }ブロック全体を短いブロックに置き換えることができます。1

そしてsed

$ sed '/^ENS[^[:blank:]]*\./s/\.[^[:blank:]]*//' file
ENST00000456328 1657    1350.015        0       0

コードはsed変更の有無にかかわらずすべての行を既に印刷しているため、他の変更は必要ありません(一方、コードでは、awk結果の出力は最初のバリエーションよりもやや合理的でなければなりませんawk)。

^ENS[^[:blank:]]*\.最後の2つのバリエーションでは、変更を試みる前に、行の先頭にあるバージョンのEnsembl IDを正規表現と一致させます。

上記のバリエーションのどれも、行の残りのデータに注意を払ったり気にする必要はありません。各行には、変更されずに渡される追加のフィールドを含めることができます。


点をフィールド区切り文字として使用することはインスピレーションを与えましたが、行のより多くのデータに点が含まれているため、問題が発生します。

おすすめ記事