1

私はNAWK(またはAWK)の非常に初心者ですが、次を使用して部分文字列の値を確認できることを知っています:

nawk '{if (substr($0,42,4)=="ABCD") {print {$0}}}' ${file}

(これは UNIX で実行されているため、' $0' になっています。)

文字列が ABCDまたはMNOP のいずれかである場合はどうなるでしょうか? これをワンライナーとしてコーディングする簡単な方法はありますか? 探してみましたが、今のところ迷っているだけです...

4

4 に答える 4

3

たとえば、次のようにします。

nawk 'substr($0,42,4)=="ABCD" || substr($0,42,4)=="MNOP"' ${file}

awk現在のコマンドには、暗黙的に処理する不要な部分がいくつかあることに注意してください。

nawk '{if (substr($0,42,4)=="ABCD") {print {$0}}}' ${file}

{print {$0}}はデフォルトのawkアクションであるため、条件と同様にスキップできますif {}。すべて一緒に、あなたはそれを好きにすることができます

nawk 'substr($0,42,4)=="ABCD"' ${file}

詳細については、Idiomatic awkを確認してください。

テスト

$ cat a
hello this is me
hello that is me
hello those is me

$ awk 'substr($0,7,4)=="this"' a
hello this is me

$ awk 'substr($0,7,4)=="this" || substr($0,7,4)=="that"' a
hello this is me
hello that is me
于 2013-10-31T12:15:01.197 に答える
2

可能な有効な値のリストが多数ある場合は、配列を宣言してから、その部分文字列が配列内にあるかどうかを確認できます。

nawk '
    BEGIN { valid["ABCD"] = 1 
            valid["MNOP"] = 1
            # ....
    }
    substr($0,42,4) in valid
' file

覚えておくべきことの 1 つ:演算子は、ではなく、in連想配列のキーを調べます。

于 2013-10-31T13:26:05.600 に答える
1

が正規表現のメタ文字ではないと仮定すると、次のように言えます。

nawk 'substr($0,42,4)~/ABCD|MNOP/' ${file}

値にメタ文字( [, \, ^, $, ., |, ?, ) が含まれている場合は*、.+でエスケープする必要があります。()\

于 2013-10-31T12:20:25.693 に答える