머리, 꼬리, 그리고 선? [복사]

머리, 꼬리, 그리고 선? [복사]

번호로 지정된 파일에서 한 줄을 추출하는 가장 간단한 방법은 무엇입니까? 예를 들어 행 666 을 원합니다 somefile. 터미널이나 쉘 스크립트에서 이 작업을 어떻게 수행합니까?

head -n 666 somefile | tail -n 1비슷한 솔루션 , 심지어 약간만 맞는 솔루션도 볼 수 있지만 cat -n somefile | grep -F 666더 좋고, 빠르고, 더 강력한 솔루션이 있어야 합니다. 좀 더 모호한 유닉스 명령/유틸리티를 사용하고 있을까요?

답변1

sed(에스트레메편집하다itor)는 이런 종류의 작업에 적합한 도구입니다.

sed -n '666p' somefile

편집: @tachomi의 솔루션은 sed '666q;d' somefile대용량 텍스트 파일을 처리할 때 더 좋습니다.sed파일의 나머지 부분을 읽지 않고 패턴을 인쇄한 후 종료합니다. 다른 모든 파일의 경우 차이점은 중요하지 않습니다.

답변2

당신은 sed를 사용할 수 있습니다

sed -n '666p' somefile

또는

sed '666!d' somefile

아니면 대용량 파일에

sed '666q;d' somefile 

Bash 스크립트에서

#!/usr/bin/bash
line=666
sed "$line"'q;d' somefile

답변3

POSIXly(대용량 파일의 경우 가장 빠름):

tail -n +666 | head -n1

답변4

펄 방식:

perl -ne 'print && exit if $.==666' file

1부터 999999까지의 숫자가 포함된 파일을 생성하여 이를 테스트했습니다. 이 문서에서 awk위와 아래의 Perl 솔루션은 exit지금까지 언급된 솔루션 중 가장 빠른 솔루션입니다.

$ perl -le 'print for 1..999999' > file

$ time perl -ne 'print && exit if $.==666' file
666

real    0m0.004s
user    0m0.000s
sys     0m0.000s

$ time awk 'NR==666 { print ; exit ; } ' file
666

real    0m0.004s
user    0m0.000s
sys     0m0.000s

$ time tail -n +666 file | head -n1
666

real    0m0.021s
user    0m0.004s
sys     0m0.000s

$ time sed -n '666p' file
666

real    0m0.125s
user    0m0.112s
sys     0m0.012s

$ time awk 'NR==666' file
666

real    0m0.161s
user    0m0.156s
sys     0m0.000s

즉, 초기 솔루션은 head -n666 file | tail -n1매우 빠르고 강력하며 이식성이 뛰어납니다. 왜 그렇지 않다고 생각하시나요?

관련 정보