
ファイルの最後の行が定数テキストの前にある場合は、特定のパターンに一致する項目を印刷するために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 text
andname
(前の行の最後に設定されているように)がある行に達すると、をc
印刷しますvalue
。name=$1;value=$2
現在の行の場合は、最初のフィールドをとして保存し、
name
2番目のフィールドをとして保存しますvalue
。
答え2
grepを使用しても問題ない場合は、一致する前に行を印刷するオプションがあります。
オプションは次のとおりです。-B num、--before-context = num
あなたの場合:
cat file.txt|grep -B 1 "constant text"|grep "c="|cut -f2 -d'='
説明する:
- 定数テキストの前の行だけが印刷されます。
- 出力からすべてのc値をフィルタリングします。
- 2番目のフィールドを抽出するには、「=」区切り文字を使用してください。
答え3
いくつかのインターネット検索でこれまでに最高の回答を見つけましたが、すでに回答を得ています。以下をtac
使ってもっと簡単にしましょう...
tac file | awk 'NR==2{if ( $1=="c") print $2}'
行番号は「定数テキスト」の次の行です。 「定数テキスト」が1行の場合 - .2行のNR==2
場合 - NR==3
.定数テキストがどの形式であるべきかはまだ決定されていません...