번호로 지정된 파일에서 한 줄을 추출하는 가장 간단한 방법은 무엇입니까? 예를 들어 행 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
매우 빠르고 강력하며 이식성이 뛰어납니다. 왜 그렇지 않다고 생각하시나요?