다른 패턴과 일치하는 줄을 제외하고 패턴 일치 전후의 일부 줄을 인쇄합니다.

다른 패턴과 일치하는 줄을 제외하고 패턴 일치 전후의 일부 줄을 인쇄합니다.

나는 패턴 일치 전후에 5줄을 인쇄하기 위해 Solaris에서 awk를 사용하고 있습니다. 현재 다음 한 줄의 코드가 작업을 수행합니다.

/usr/xpg4/bin/awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=5 a=5 s="ERROR" file

그러나 결과는 만족스럽지 못했습니다. 첫째, 다음과 같은 원치 않는 줄이 포함되어 있습니다.

  • 게임 자체와 관련된 대사
  • 빈 줄
  • (원치 않는) 패턴과 일치하는 라인.
    • 제거하다
    • 무의미한 말
    • 멍청한

또한 각 염기는 대시가 포함된 선으로 구분되어야 합니다.

입력 예:

stupid
remove

keep it
*
MATCH
keep it as well



remove

important
                                                     *
MATCH at line 2:
needed
also

this line should be kept
                                                     *
MATCH at line 2:
this to save
very important



remove

keep it
*
MATCH
keep it as well

nonsense
another nonsense

예상 출력:

keep it
keep it as well
---
important
needed
also
---
this line should be kept
this to save
very important
---
keep it
keep it as well

우아한 방식으로 구현하는 방법은 무엇입니까?

답변1

아직 예상되는 출력이 명확하지 않지만 시도해 보겠습니다. Solaris에 gnu 유틸리티가 있는 경우 매우 간단한 방법으로 gawk 및 ggrep을 사용할 수 있습니다.

gawk 'NF > 0' fileName  |ggrep -C5 pattern

원하지 않는 단어를 필터링하려면 끝에 |ggrep -v somePattern을 추가할 수 있습니다.

관련 정보