줄 번호 앞에 패턴을 사용하여 줄을 얻는 방법? 1.fruits linenum 2.cherry linenum 3.apple . . linenum 7.orange linenum 8.apple2 . . . linenum 20.strawberry 위의

파일의 특정 줄 번호 앞에 패턴과 일치하는 줄을 가져와야합니다.

예:

linenum 1.fruits
linenum 2.cherry
linenum 3.apple
.
.
linenum 7.orange
linenum 8.apple2
.
.
.
linenum 20.strawberry

위의 파일에서 line8을 원합니다. 나는 그것이 20 번째 줄 위에 올 것이라는 것을 알고 있으며 그 줄에 포함되어 있음을 알고 있습니다 apple.



답변

태그는 에도 불구하고 내 대답은 사용하지 않습니다 sed.

다음 명령은 처음 19 행을 가져 와서없는 행을 버린 apple다음 남은 항목에서 마지막 행을 반환합니다.

head -n 19 | grep "apple" | tail -n 1

이름이 지정된 파일을 처리하려면 다음을 수행하십시오 file.txt.

<file.txt head -n 19 | grep "apple" | tail -n 1

답변

다음을 사용하는 솔루션이 있습니다 sed.

sed -n '20,$d;/apple/h;19{x;p}'
  • -n -라인 인쇄 금지
  • 20,$d20파일의 끝 부터 끝까지 ( $), 삭제 ( d)
  • /apple/h-정규식과 일치하는 행 /apple/에 대해서는 ” 보유 공간 “( h)에 복사하십시오.
  • 19{x;p}-온라인 19에서 패턴을 바꾸고 공백을 잡고 ( x) 패턴 공간을 인쇄합니다 ( p)

그 이후의 19모든 행이 삭제되므로 최종 인쇄에는 행을 사용해야합니다 . 그렇지 않으면 ” 마지막 줄 “주소를 사용할 수 있습니다 $.


이 테스트에서는 apple23 행 을 추가했습니다 .

$ sed -n '20,$d;/apple/h;19{x;p}' < file
linenum 8.apple2

답변

이번에는 Perl에 이미 게시 된 것과 동일한 솔루션입니다.

perl -lane 'if(1..19 and /apple/){$a=$_} END{print $a}' input.txt

그리고 AWK :

awk 'NR<20 && /apple/ {a=$0} END{print a}' input.txt