次のフィールドを含む入力ファイルがあります。
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を正規表現と一致させます。
上記のバリエーションのどれも、行の残りのデータに注意を払ったり気にする必要はありません。各行には、変更されずに渡される追加のフィールドを含めることができます。
点をフィールド区切り文字として使用することはインスピレーションを与えましたが、行のより多くのデータに点が含まれているため、問題が発生します。