줄 번호 앞에 패턴을 사용하여 줄을 얻는 방법?


1

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

예:

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

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


1
line8로 무엇을하고 싶습니까? 당신은 무엇을 시도했습니다. 대부분의 질문은 여기에서 대답 할 수 있습니다 .
AFH

1
( "제외하고 어떤 기준 이있다apple ") 당신이 작업하는? 라인 20 위의 라인은 apple무엇입니까?
Attie

컨텍스트를 추가하고 노력을 보여주십시오. 그렇지 않으면 배우는 연습처럼 보입니다 sed.
simlev

답변:


1

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

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

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

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

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

1

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

sed -n '20,$d;/apple/h;19{x;p}'
  • -n -라인 인쇄 금지
  • 20,$d- 20파일의 끝 부터 끝까지 ( $), 삭제 ( 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

0

이번에는 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.