Awk

僅匹配第一次出現的字元串,然後添加 N 行 awk

  • February 1, 2022

您好想在匹配字元串的第一次出現後提取 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

由於將它們複製到網頁,這些表格有點不穩定。任何建議的幫助將不勝感激。

處理此問題的一種方法是在c返回 0 時退出:

c { print; if (--c == 0) exit }; /XCHT/{c=10}

或更簡潔地說,

c; c && !--c { exit }; /XCHT/{c=10}

GNUgrep可以做類似的事情:

grep -m1 -A10 XCHT

(但這也會顯示匹配“XCHT”的第一行)。

您似乎正在嘗試列印一個以空行分隔的記錄,該記錄恰好有 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  |
|                 |    |
|                 |    |

引用自:https://unix.stackexchange.com/questions/688818