正規表現に基づいて列を追加する方法

正規表現に基づいて列を追加する方法

bla.tsvファイルがあります(FS = \t)。

>hCoV-19/xxx/xxx-YYY/xxx
>hCoV-19/xxx/xxx-ZZZ/xxx

正確:

  • 実際に文字を書くとすべての行にそのまま現れるからだ。
  • 文字がxxxとして記録されると表示されますが、行ごとに異なるためです(たとえば、文字、数字、またはその他の項目のセットなど)。
  • YYYとZZZという文字は、私が興味のあるパターンで数字または文字にすることができます。

新しい列を取得するためにファイルを変換したいと思います。

YYY >hCoV-19/xxx/xxx-YYY/xxx
ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx

/3番目の正規表現の後に一致し、前の正規表現に戻る正規表現を見つける必要があることを知っていますが、何-度も試してもまだ見つかりませんでしたhttps://regexr.com/。正規表現を実行し、結果を最初の列に入れる方法を知っていますか?ありがとう

ベストアンサー1

$ cat file
>hCoV-19/xxx/xxx-YYY/xxx
>hCoV-19/xxx/xxx-ZZZ/xxx
$ awk -F '[/-]' '{ printf "%s %s\n", $5, $0 }' file
YYY >hCoV-19/xxx/xxx-YYY/xxx
ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx

上記のコードは、データをawkまたはフィールドで区切られた/行として扱います-。 5番目のフィールドは各行の前に追加したいフィールドprintfです。

区切り文字としてのみ使用され、3番目のスラッシュで区切られたフィールドは良い区切り文字ではありません-(たとえば、最初のスラッシュの前の文字列にダッシュが含まれない場合があります)。結果は次のとおりです。/-

$ awk -F / '{ split($3,a,"-"); printf "%s %s\n", a[2], $0 }' file
YYY >hCoV-19/xxx/xxx-YYY/xxx
ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx

使用sed:

$ sed 's/.*-\([^/]*\).*/\1 &/' file
YYY >hCoV-19/xxx/xxx-YYY/xxx
ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx

または、Plan9を使用している場合、または角括弧式に内部問題を持つsedPlan9実装を使用している場合は、このコマンドに代替区切り文字セットを使用してください。/s///

$ sed 's,.*-\([^/]*\).*,\1 &,' file
YYY >hCoV-19/xxx/xxx-YYY/xxx
ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx

ここで使用される正規表現は、行の/最後の文字の後に文字が含まれていない部分文字列をキャプチャします-。次に、キャプチャされた部分文字列と行の前にスペースを追加します。

sedawkこの解決策と以前の解決策の主な違いは、awkコードが各行にフィールドと似た構造を使用しているのに対し、コードsedは「ダッシュ」してダッシュの後にスラッシュ以外の文字で構成される文字列を見つけることです。


このhttps://regexr.com/サイトは現在、JavaScript正規表現とPerl互換正規表現(PCRE)をサポートしています。ここでは、これらの言語のいずれかを使用していないので、サイトで知らせるものが何であれ、おそらく機能しません。 awkPOSIX ERE(拡張正規表現)が使用され、テキスト操作のための他のほとんどの標準Unixツール(BREを含むsed)はPOSIX基本正規表現(BRE)を使用します。

また、見ることができます私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?

おすすめ記事