awk正規表現一致式でコマンドライン引数を使用する方法は?

awk正規表現一致式でコマンドライン引数を使用する方法は?

次のawkスクリプトがあります。

#!/bin/awk -f

BEGIN {
    FS  = "";
}

value ~ "MYVALUE" # silly test
{
    print "1 - " substr($0, 235, 12);
}

$235 ~ "M" {
    print "2 - " substr($0, 235, 12);
}

{
    if(value == substr($0, 235, 12))
    {
        print "3 - " substr($0, 235, 12);
    }
    if(match(value,substr($0, 235, 12)))
    {
        print "4 - " substr($0, 235, 12);
    }
}

END {
    print "exit"
}

私はそれを次のように実行します:./script.awk -v value="MYVALUE" my_file

これは私のRHEL 5.5 awkです。

$ ls -l  $(which awk)
lrwxrwxrwx 1 root root 4 Jul 10  2015 /bin/awk -> gawk
$ gawk --version
GNU Awk 3.1.5

1と2が動作します。ただし、2に次の改行文字を入れると、次のようになります{

$235 ~ "M" 
{
    print "2 - " substr($0, 235, 12);
}

出力は単なる印刷ではなく、完全に一致する行です。

私がやりたいことはvalue正規表現を使って一致させることですが、常に失敗します。それは次のとおりです。

$235...$247 ~ value

例を見た([1831722][Unix/27410]) は単一文字と一致しますが、式と一致しません。

編集する

わかりやすくするために、awkに渡されたコマンドライン引数を使用し、それを行の複数文字オフセットとして使用して、フィールド区切り文字なしで行を一致させたいと思います。私はPythonをハックしました。

#!/usr/bin/python

import re

t   = 'ABC'
rg  = '^.{235,235}' + t
rgx = re.compile(rg)
tt  = '00000ABC00'
if(rgx.match(tt)):
    print "OK"
else:
    print "KO"

このユースケースに対してのみ問題のファイルがかなり大きいので、awkはより速くなります。

ベストアンサー1

私はこれが少し古いことを知っていますが、他の人がここに来たら、いくつかのコメントを追加すると思いました。最初に一連のフィールドを作成するには、フィールドをで区切ります,

$235, $247 ~ value { ... action here ... }

必要に応じて、この関数の出力を直接使用してsubstr一致を見つけることもできます。

substr($0, 235, 12) ~ value { ... action here ... }

そしてあなたも発見したようですね。一部校正装置の数が重要です。各一致に対して、ジョブのペア、一致、またはジョブは暗黙的なデフォルト値(すべて一致または$ 0印刷)になる可能性があるため、変更してください。

$235 ~ "M" {  print "2 - " substr($0, 235, 12);  }

到着

$235 ~ "M" 
{  print "2 - " substr($0, 235, 12);  }

意味をからにprint this substring only when field 235 is an M変更しますwhenever field 235 is an M print the whole record, AND for every record, print the substring。たとえば、各レコードの部分文字列に対して複数のチェックを実行する必要がある場合は、この方法を使用できます。最初の操作は次のとおりです。

BEGIN { FS="" }
# oursubstr will be updated first for each record.
{ oursubstr = substr($0, 235, 12) } 
oursubstr ~ value { ... action ... }
...

おすすめ記事