이 데이터에서 n번째 "청크"를 추출할 수 있나요?

이 데이터에서 n번째 "청크"를 추출할 수 있나요?

stdout다음과 같은 텍스트 블록이 많이 있습니다 .

% QUESTION
Who played drums for The Beatles?


% QUESTION
Who played
guitar

for The Beatles?


% QUESTION
Who played

bass for The Beatles

?

여기서의 아이디어는 파일이 "청크"로 나누어져 있고 각 청크가 한 줄로 시작한다는 것입니다 % QUESTION. 이 데이터의 n번째 청크를 인쇄하는 스크립트를 작성하고 싶습니다.

예를 들어 distribution은 nthchunk 3인쇄되어야 합니다.

Who played

bass for The Beatles

?

어떻게 해야 하나요?

답변1

awk정규식을 레코드 구분 기호( )로 지원하는 RS구현(예: GNU)을 사용하면 awk다음을 수행할 수 있습니다.

awk -v n=3 -v RS='(\n+|^)% QUESTION\n' 'NR == n+1 {print; exit}' < questions.txt

답변2

GNU sed-E이 문제를 해결하기 위해 확장된 정규식 패턴을 사용 합니다. 기본 아이디어는 연속적인 % 문제 행과 그 사이의 행을 패턴 공간에 축적하는 것입니다. 카운터는 일련의 점 형태로 저장 공간에 유지됩니다.

chunk=2
sed -E ':loop
  /%/,/%/N
  /%.*%/!{
    /%/!d;$!bloop
    s/$/\nfiller/
  }
  G;s/$/./
  /\n[.]{'"${chunk}"'}$/bend
  h;s/.*\n//;x
  s/.*(\n.*)\n.*$/\1/;D
  :end
  s/^[^\n]*\n+(\S.*\S)(\n.*){2}$/\1/
  q
' file

대안으로, Perl은 slurp 모드에 있고 FS는 문제 라인으로 설정됩니다. @F 배열의 요소는 블록이어야 합니다.

perl \
  -F'/(?:^|\n+)\%\h+QUESTION\n+/' \
  -pals -0777 \
  -e '$_=$F[$n]' \
-- -n="${chunk}" ./file;

산출:

Who played
guitar

for The Beatles?

답변3

이 데이터의 n번째 청크를 인쇄하는 스크립트를 작성하고 싶습니다.

RS합계를 설정하면 ORS다음과 같은 각 질문을 얻을 수 있습니다.

이 필요다중 문자 RS용 GNU awk

awk -v RS='% QUESTION'  -v ORS='' '/\<drums\>/ {print $0}' file

Who played drums for The Beatles?
  • 또는bass
awk -v RS='% QUESTION'  -v ORS='' '/\<bass\>/ {print $0}' file

Who played

bass for The Beatles

?
  • 또는 guitar:
awk -v RS='% QUESTION'  -v ORS='' '/\<guitar\>/ {print $0}' file

Who played
guitar

for The Beatles?
  • 또는 블록 대신 숫자를 사용하십시오.
$ nchunk=3
awk -v nchunk="$nchunk" -v RS='% QUESTION'  -v ORS=''  'NR==nchunk+1 {print $0}' file

Who played

bass for The Beatles

?

관련 정보