3

特定のファイル名を扱っており、それらから情報を抽出する必要があります。

ファイル名の構造は、「20100613_M4_28007834.005_F_RANDOMSTR.raw.gz」のようになります。

RANDOMSTR は最大 22 文字の文字列で、「-W[0-9].[0-9]{2}.[0-9]{3}」という形式の部分文字列を含む (または含まない) 場合があります。この部分文字列には、「-W」で始まる独自の機能もあります。

抽出する必要がある情報は、このオプションの部分文字列を除いた RANDOMSTR の部分文字列です。

これを bash スクリプトに実装したいのですが、これまでのところ、正規表現で gawk を使用するのが最善の方法です。これまでの私の最善の試みは失敗します:

gawk --re-interval '{match ($0,"([0-9]{8})_(M[0-9])_([0-9]{8}\\.[0-9]{3})_(.)_(.*)(-W.*)?.raw.gz",arr); print arr[5]}' <<< "20100613_M4_28007834.005_F_OTHER-STRING-W0.40+045.raw.gz"
OTHER-STRING-W0.40+045

期待される結果は次のとおりです。

gawk --re-interval '{match ($0,$regexp,arr); print arr[5]}' <<< "20100613_M4_28007834.005_F_SOME-STRING.raw.gz"
SOME-STRING
gawk --re-interval '{match ($0,$regexp,arr); print arr[5]}' <<< "20100613_M4_28007834.005_F_OTHER-STRING-W0.40+045.raw.gz"
OTHER-STRING

どうすれば望ましい効果を得ることができますか。

ありがとう。

4

4 に答える 4

2

ルックアラウンドを使用できるようにする必要があります。awk/gawk はそれをサポートしているとは思いませんが、サポートしてgrep -Pいます。

$ pat='(?<=[0-9]{8}_M[0-9]_[0-9]{8}\.[0-9]{3}_._)(.*?)(?=(-W.*)?\.raw\.gz)'
$ echo "20100613_M4_28007834.005_F_SOME-STRING.raw.gz" | grep -Po "$pat"
SOME-STRING
$ echo "20100613_M4_28007834.005_F_OTHER-STRING-W0.40+045.raw.gz" | grep -Po "$pat"
OTHER-STRING
于 2010-12-15T15:32:22.430 に答える
1

grep ソリューションは確かに非常に優れていますが、OP ではオペレーティング システムについて言及されておらず、-Pオプションは Linux でのみ使用できるようです。awkでこれを行うのも非常に簡単です。

$ awk -F_ '{sub(/(-W[0-9].[0-9]+.[0-9]+)?\.raw\.gz$/,"",$NF); print $NF}' <<EOT
> 20100613_M4_28007834.005_F_SOME-STRING.raw.gz
> 20100613_M4_28007834.005_F_OTHER-STRING-W0.40+045.raw.gz
> EOT
SOME-STRING
OTHER-STRING
$ 

これは「20100613_M4_28007834.005_F_OTHER-STRING-W0_40+045.raw.gz」で壊れることに注意してください。これがリスクであり、-W上記の場所にしか表示されない場合は、次のようなものを使用することをお勧めします。

$ awk -F_ '{sub(/(-W[0-9.+]+)?\.raw\.gz$/,"",$NF); print $NF}'
于 2012-01-31T05:45:25.857 に答える
0

ここでの難しさは(.*)、オプションの前(-W.*)?が後者のテキストをむさぼり食うという事実のようです。貪欲でない一致を使用しても役に立ちません。残念ながら、私の regex-fu はこれに対抗するには弱すぎます。

マルチパス ソリューションを気にしない場合、より簡単な方法は、最初に末尾の.raw.gzと possibleを削除して入力をサニタイズすること-W*です。

str="20100613_M4_28007834.005_F_OTHER-STRING-W0.40+045.raw.gz"
echo ${str%.raw.gz}  | # remove trailing .raw.gz
     sed 's/-W.*$//' | # remove trainling -W.*, if any
     sed -nr 's/[0-9]{8}_M[0-9]_[0-9]{8}\.[0-9]{3}_._(.*)/\1/p'

私は sed を使用しましたが、gawk/awk を使用することもできます。

于 2010-12-15T15:26:25.163 に答える
0

気が進まない量指定子を実行することはできませんでしたが、2 つの正規表現を順番に実行するとうまくいきます。

sed -E -e 's/^.{27}(.*).raw.gz$/\1/' << FOO | sed -E -e 's/-W[0-9.]+\+[0-9.]+$//'
20100613_M4_28007834.005_F_SOME-STRING.raw.gz
20100613_M4_28007834.005_F_OTHER-STRING-W0.40+045.raw.gz
FOO
于 2012-01-31T05:25:02.550 に答える