awk: 패턴과 일치하는 단락의 마지막 n개 발생을 인쇄합니다.

awk: 패턴과 일치하는 단락의 마지막 n개 발생을 인쇄합니다.

이 명령을 사용하여 awk -v RS= '/index/' longfile > dataIwant다음 구조를 기반으로 데이터 단락을 파일에 저장합니다.dataIwantlongfile

 index   value       count 
      1     -32.4613      1.00000
      2     -20.5946      1.00000
      3     -13.3573      1.00000
      4     -13.2064      1.00000
      5     -13.2064      0.00000


 other stuff


 index   value       count 
      1     -31.4613      1.00000
      2     -19.5946      1.00000
      3     -12.3573      1.00000
      4     -12.2064      1.00000
      5     -12.2064      0.00000
 

 still a lot of other stuff


 index   value       count 
      1     -33.4613      1.00000
      2     -21.5946      1.00000
      3     -15.3573      1.00000
      4     -15.2064      0.00000
      5     -15.2064      0.00000


 again a lot of other stuff (and so on many times)

테이블 "인덱스, 값, 개수"의 마지막 n(예: 2) 항목만 모두 파일에 저장하는 대신 파일에 저장하는 방법은 무엇입니까?

예상 출력:

 index   value       count 
      1     -31.4613      1.00000
      2     -19.5946      1.00000
      3     -12.3573      1.00000
      4     -12.2064      1.00000
      5     -12.2064      0.00000
 index   value       count 
      1     -33.4613      1.00000
      2     -21.5946      1.00000
      3     -15.3573      1.00000
      4     -15.2064      0.00000
      5     -15.2064      0.00000

답변1

마지막 n개 레코드의 스크롤 버퍼를 유지하고 END에 인쇄하세요.

$ cat tst.awk
BEGIN { RS=""; ORS="\n\n" }
/index/ { recs[(++c)%n] = $0 }
END {
    for ( i=1; i<=n; i++ ) {
        print recs[(++c)%n]
    }
}

$ awk -v n=2 -f tst.awk file
 index   value       count
      1     -31.4613      1.00000
      2     -19.5946      1.00000
      3     -12.3573      1.00000
      4     -12.2064      1.00000
      5     -12.2064      0.00000


 index   value       count
      1     -33.4613      1.00000
      2     -21.5946      1.00000
      3     -15.3573      1.00000
      4     -15.2064      0.00000
      5     -15.2064      0.00000

답변2

일치하는 단락을 배열에 저장하고 다음과 같이 블록의 END마지막 요소를 인쇄합니다 .nn=3

awk  -v n=3 -v RS= '/index/{z[i++]=$0};END{for (j=i-n; j<=i; j++) print z[j]}' in > out

관련 정보