仅匹配字符串的第一次出现,然后添加 N 行 awk

仅匹配字符串的第一次出现,然后添加 N 行 awk

您好,希望在匹配第一次出现的字符串后提取 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  |
|                 |    |
|                 |    |

相关内容