1

私の Linux 端末では、そのような出現回数を見つける必要があります。ここで、pattern 1pattern 2は、正確にn行を隔てた 2 行にpattern 3表示され、これらのn行のいずれにも表示できない追加の要件があります。たとえば、テキストファイルがある場合

...
a
* pat1 **
b
c
** pat2 ****
* pat1 **
b
** pat2 ****
*******pat1**
efda
*pat3****
**pat2********
...

n=2pattern 1is pat1pattern 2is pat2、およびpattern 3isの場合pat3、出現は 1 回だけです。

awk、 (またはその姉妹)などのユーティリティツールでこれを便利に行う方法。これを行うgrepためにpythonまたはperlを使用する方法は知っていますが、これらのユーティリティツールでも同じことができるかどうか疑問に思っています。

ありがとうございました。

これは、@Barmarの回答を読んだ後に試したものです

awk -v n=2 '/pat1/ { first = NR } 
           !/pat3/ 
            /pat2/ && first && NR - first == n { count++ } END {print count}'

しかし、私はまだそれを正しく理解していませんでした。4 つのシナリオでこれを行う必要があります。

  • pat1pat3同じです。
  • pat2pat3同じです。
  • これら 3 つのパターンはすべて同じです。
  • これらの 2 つが同じではありません。
4

2 に答える 2

2
awk -v n=2 '/pat1/ { first = NR }
            /pat2/ && first && NR - first == n { count++ }
            END {print count}'

pat3追加の要件を含むコードは次のとおりです。

awk -v n=2 '/pat3/ && first { pat3 = 1; first = 0 }
            /pat1/ && !pat3 { first = NR }
            /pat2/ && first && NR - first == n { count++; first = 0 }
            END {print count}'

これは、パターンのすべての組み合わせが同じであればうまくいくと思いますが、テストしていません。パターンが同じである可能性がある場合にこのトリックを作成するのは、スクリプト内の 1 つのテストに一致する行が残りのテストを実行することを妨げないためです。pat3したがって、スクリプトは状態変数をリセットしfirst、同じ行を apat1pat3match の両方として扱わないようにする必要があります。

あなたの試みでは、行

!/pat3/

何もしません。まず第一に、これは構文的に正しくありません。すべてのテストの後に、一致したときに何をすべきかを示すステートメントまたはブロックが必要です。第二に、空のブロックをその後に置いたとしても、それは単に「現在の行が pat3 と一致しない場合、何もしない」ことを意味します。スクリプト内の他のパタ​​ーン マッチの動作には影響しません。

awk の基本的な操作モデルを学ぶには、awk チュートリアルを見つける必要があると思います。ここで教えようとするつもりはありません。これは個別指導サイトではありません。

于 2013-07-02T03:53:06.807 に答える
1

を使用:

sed -ne '/pat1/{N;N;/\([^\n]*\n\)\{2\}.*pat2/{/pat3/!p}}' input

いくつかの説明:

if (pat1 matches) {                     #  /pat1/{
     read and append 2 lines            #  N;N;
     if (pat2 matches after 2 '\n's) {  #  /\([^\n]*\n\)\{2\}.*pat2/ {
          if (pat3 does not match) {    #  /pat3/!
             print                      #  p
          }                             
      }                                 #  }
 }                                      #  }
于 2013-07-02T04:28:06.653 に答える