awkは、他の一致前の最後のレコードである場合にのみ一致を印刷します。

awkは、他の一致前の最後のレコードである場合にのみ一致を印刷します。

ファイルの最後の行が定数テキストの前にある場合は、特定のパターンに一致する項目を印刷するためにawkを使用したいと思います。

たとえば、「c」の値が定数テキストの前の最後の行である場合にのみ印刷したいと思います。

cat file.txt:
a=1
b=2
c=3
...constant text...

3を印刷します。

cat file.txt:
a=1
c=3
b=2
...constant text...

何も印刷しないでください。

どうすればいいですか? awkはそれがファイルの最後の番号であるかどうかをどうやって知ることができますか?

答え1

ファイルの最後の行が定数テキストの前にある場合は、特定のパターンに一致する項目を印刷するためにawkを使用したいと思います。

この場合は、次のことを試してください。

awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file

はい

$ cat file1 
a=1
b=2
c=3
...constant text...
$ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file1
3
$ cat file2
a=1
c=3
b=2
...constant text...
$ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file2
$ 

どのように動作しますか?

  • -F=

    これは、フィールド区切り文字awkとして使用することを意味します。=これによりa=1、または同じフィールドの名前と値を分離できますc=3

  • /constant text/ && name=="c"{print value}

    constant textand name(前の行の最後に設定されているように)がある行に達すると、をc印刷しますvalue

  • name=$1;value=$2

    現在の行の場合は、最初のフィールドをとして保存し、name2番目のフィールドをとして保存しますvalue

答え2

grepを使用しても問題ない場合は、一致する前に行を印刷するオプションがあります。

オプションは次のとおりです。-B num、--before-context = num

あなたの場合:

cat file.txt|grep -B 1 "constant text"|grep "c="|cut -f2 -d'='

説明する:

  1. 定数テキストの前の行だけが印刷されます。
  2. 出力からすべてのc値をフィルタリングします。
  3. 2番目のフィールドを抽出するには、「=」区切り文字を使用してください。

答え3

いくつかのインターネット検索でこれまでに最高の回答を見つけましたが、すでに回答を得ています。以下をtac使ってもっと簡単にしましょう...

tac file | awk 'NR==2{if ( $1=="c") print $2}'

行番号は「定数テキスト」の次の行です。 「定数テキスト」が1行の場合 - .2行のNR==2場合 - NR==3.定数テキストがどの形式であるべきかはまだ決定されていません...

関連情報