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
由於將它們複製到網頁,這些表格有點不穩定。任何建議的幫助將不勝感激。
處理此問題的一種方法是在
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”的第一行)。
您似乎正在嘗試列印一個以空行分隔的記錄,該記錄恰好有 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 | | | | | | |