こんにちは、文字列の最初の出現を一致させた後にN行を抽出し、awkを使用して次のN行を印刷したいと思います。この文字列は、私が作業しているファイルで何度も繰り返されます。私は次のコマンドを試しました。
'c&&c--;/XCHT/{c=10}'
これにより、一致するすべてのイベント+ 10行が印刷されます。多くの検索の最後にこのコマンドのさまざまなバージョンを見ましたが、すべて以下のようにほぼ同じ結果を生成します。周りを見回して気づいた。結果を得るためにこのコマンドを修正する方法に関するいくつかのヒントを知りたいです。
私が達成したい試合結果は次のとおりです。
| XCHT | |
|-----------------|----|
| 柴胡chaihu | 24 |
| 黄芩huangqin | 9 |
| 法半夏banxia | 12 |
| 生姜shengjiang | 9 |
| 刺五加ciwujia | 9 |
| 大枣dazao | 6 |
| 炙甘草zhigancao | 9 |
| | |
| | |
ファイルの一部は次のとおりです。
## XCHT
| XCHT | |
|-----------------|----|
| 柴胡chaihu | 24 |
| 黄芩huangqin | 9 |
| 法半夏banxia | 12 |
| 生姜shengjiang | 9 |
| 刺五加ciwujia | 9 |
| 大枣dazao | 6 |
| 炙甘草zhigancao | 9 |
| | |
| | |
## XCHT+CM
| | |
|-----------------|----|
| 柴胡chaihu | 24 |
| 黄芩huangqin | 9 |
| 法半夏banxia | 12 |
| 干姜ganjiang | 9 |
| 五味子wuweizi | 9 |
| 炙甘草zhigancao | 9 |
| | |
| | |
## XCHT+TM
| XCHT+TM | |
|----------------- |----|
| 柴胡chaihu | 24 |
| 黄芩huangqin | 9 |
| 法天花粉tianhuafen | 12 |
| 生姜shengjiang | 9 |
| 刺五加ciwujia | 12 |
| 大枣dazao | 6 |
| 炙甘草zhigancao | 9 |
| | |
| | |
| XCHT-HQin+FL | |
|-----------------|----|
| 柴胡chaihu | 24 |
| 黄茯苓fuling | 12 |
| 法半夏banxia | 12 |
| 生姜shengjiang | 9 |
| 刺五加ciwujia | 9 |
| 大枣dazao | 6 |
| 炙甘草zhigancao | 9 |
| | |
| | |
## XCHT-DZ+ML
| XCHT-DZ+ML | |
|-----------------|-----|
| 柴胡chaihu | 12 |
| 黄芩huangqin | 4.5 |
| 法半夏banxia | 6 |
| 生姜shengjiang | 4.5 |
| 刺五加ciwujia | 4.5 |
| 牡蛎 muli | 6 |
| 炙甘草zhigancao | 4.5 |
| | |
| | |
'c&&c--;/XCHT/{c=10}'
ファイルのコマンド結果
| XCHT | |
|-----------------|----|
| 柴胡chaihu | 24 |
| 黄芩huangqin | 9 |
| 法半夏banxia | 12 |
| 生姜shengjiang | 9 |
| 刺五加ciwujia | 9 |
| 大枣dazao | 6 |
| 炙甘草zhigancao | 9 |
| | |
| | |
| XCHT | |
|-----------------|----|
| 柴胡chaihu | 24 |
| 黄芩huangqin | 9 |
| 法半夏banxia | 12 |
| 干姜ganjiang | 9 |
| 五味子wuweizi | 9 |
| 炙甘草zhigancao | 9 |
| | |
| | |
| XCHT+TM | |
|----------------- |----|
| 柴胡chaihu | 24 |
| 黄芩huangqin | 9 |
| 法天花粉tianhuafen | 12 |
| 生姜shengjiang | 9 |
| 刺五加ciwujia | 12 |
| 大枣dazao | 6 |
| 炙甘草zhigancao | 9 |
| | |
| | |
| XCHT-DZ+ML | |
|-----------------|-----|
| 柴胡chaihu | 12 |
| 黄芩huangqin | 4.5 |
| 法半夏banxia | 6 |
| 生姜shengjiang | 4.5 |
| 刺五加ciwujia | 4.5 |
| 牡蛎 muli | 6 |
| 炙甘草zhigancao | 4.5 |
| | |
| | |
| Xiao Chaihi Tang -HQ+BS | |
|-------------------------|----|
| 柴胡chaihu | 24 |
| 白芍baishao | 9 |
| 法半夏banxia | 12 |
| 生姜shengjiang | 9 |
| 刺五加ciwujia | 9 |
| 大枣dazao | 6 |
| 炙甘草zhigancao | 9
テーブルをWebページにコピーするため、テーブルは少し不安定です。提案された助けをいただきありがとうございます。
答え1
これを処理する1つの方法は、c
0が返されたときに終了することです。
c { print; if (--c == 0) exit }; /XCHT/{c=10}
またはもう少し簡単に言えば、
c; c && !--c { exit }; /XCHT/{c=10}
GNUはgrep
同様のことができます:
grep -m1 -A10 XCHT
(しかし、これは「XCHT」と一致する最初の行も表示します)。
答え2
正確に10行の空白行で区切られたレコードを印刷したいようです。 awkを使用すると、行数を数え、レコードが何行だと思うかをハードコードする必要はありません。RS
長さに関係なくそのようなレコードを処理するには、空の文字列に設定するだけです。
次の行が##
入力に実際に存在しない場合、必要なものは次のとおりです。
awk -v RS= '/XCHT/{print; exit}' file
それ以外の行が存在する場合は、sub()を使用して削除できます。
$ awk -v RS= '{sub(/##[^\n]*(\n|$)/,"")} /XCHT/{print; exit}' file
| XCHT | |
|-----------------|----|
| 柴胡chaihu | 24 |
| 黄芩huangqin | 9 |
| 法半夏banxia | 12 |
| 生姜shengjiang | 9 |
| 刺五加ciwujia | 9 |
| 大枣dazao | 6 |
| 炙甘草zhigancao | 9 |
| | |
| | |