
안녕하세요, 문자열의 첫 번째 발생을 일치시킨 후 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}
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 |
| | |
| | |