Staphylococcus_sp_HMSC14C01-KV792037.1:0.00371647154267842634,Staphylococcus_hominis_VCU122-AHLD01000058.1:0.00124439639436691308)69:0.00227646100249620856,(Staphylococcus_sp_HMSC072E01-KV814990.1:0.00288325234399461859,(((Staphylococcus_hominis_793_SHAE-JUSR01000051.1:0.00594391769091206796,Staphylococcus_pettenkoferi_1286_SHAE-JVVL01000037.1:0.00594050248317441135)
カンマは異なる項目を区別し、各項目からその間のすべての項目を削除します-
。:
-
:
どうすればいいですか?したがって、次のようにする必要があります。
Staphylococcus_sp_HMSC14C01:0.00371647154267842634,Staphylococcus_hominis_VCU122:0.00124439639436691308)69:0.00227646100249620856
を使用しましたが、sed 's/-.*://' 1.file > 2.file
最終的にファイル全体を削除し、最初の値と最後の値のみを保持しました。
答え1
.*
以下に一致する貪欲な正規表現です。最長可能な一致。最短の一致を一致させる必要がありますが、行全体で完全に一致する必要があります。努力する
sed 's/-[^:-]*:/:/g' 1.file > 2.file
文字クラスは[^:-]
何でも一致します。とは別にコロンとダッシュ(コロンを除くすべての項目と一致する必要があるかもしれません)、したがって正規表現は「ダッシュの後にダッシュではなく、コロン以外の文字が続き、その後にコロンが続きます」を意味します。その後、それをコロンで置き換え(維持したいので)、その行g
でグローバル置換(末尾)を実行します。省略すると、g
最初のインスタンスのみが置き換えられます。
答え2
アッ解決策:
awk -F',' '{ for(i=1;i<=NF;i++) sub(/-[^:-]+/,"",$i) }1' OFS=',' 1.file
-F','
- フィールド区切り記号for(i=1;i<=NF;i++)
- レコードのすべてのフィールドを繰り返します。sub(/-[^:-]+/,"",$i
- 希望のシーケンスを交換します(〜サイ-そして:含む-しかし続ける:)
出力:
Staphylococcus_sp_HMSC14C01:0.00371647154267842634,Staphylococcus_hominis_VCU122:0.00124439639436691308)69:0.00227646100249620856,(Staphylococcus_sp_HMSC072E01:0.00288325234399461859,(((Staphylococcus_hominis_793_SHAE:0.00594391769091206796,Staphylococcus_pettenkoferi_1286_SHAE:0.00594050248317441135)