您好,希望在匹配第一次出现的字符串后提取 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
由于将它们复制到网页,这些表格有点不稳定。任何建议的帮助将不胜感激。
答案1
处理这个问题的一种方法是当c
返回到 0 时退出:
c { print; if (--c == 0) exit }; /XCHT/{c=10}
或者更简洁地说,
c; c && !--c { exit }; /XCHT/{c=10}
GNUgrep
可以做类似的事情:
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 |
| | |
| | |