매우 큰 파일에서 정확한 줄을 추출하고 싶습니다. 예를 들어 8000행은 다음과 같습니다.
command -line 8000 > output_line_8000.txt
답변1
perl
그리고 이미 답을 갖고 있습니다 awk
. 대답 은 다음과 같습니다 sed
.
sed -n '8000{p;q}' file
이 명령의 장점은 8000행을 읽은 후 종료된다는 q
것입니다 ( 다른 방법 과 달리 (공동 창의성을 통해 수정됨, 하하)).sed
perl
awk
순수 Bash 가능성(bash≥4):
mapfile -s 7999 -n 1 ary < file
printf '%s' "${ary[0]}"
file
그러면 배열의 내용 ary
(필드당 한 행)을 읽지만 처음 7999개 행( -s 7999
)을 건너뛰고 한 행( -n 1
)만 읽습니다.
답변2
토요일인데 더 이상 할 일이 없어서 몇 가지의 속도를 테스트해 보았습니다. sed
, gawk
및 메소드는 기본적으로 동일하다는 것이 밝혀졌습니다 perl
. 머리와 꼬리가 가장 느리지만 놀랍게도 가장 빠르다.1차수순수한 bash입니다.
내 테스트는 다음과 같습니다.
$ for i in {1..5000000}; do echo "This is line $i" >>file; done
위의 내용은 1억 라인을 차지하는 5천만 라인의 파일을 생성합니다.
$ for cmd in "sed -n '8000{p;q}' file" \
"perl -ne 'print && exit if $. == 8000' file" \
"awk 'FNR==8000 {print;exit}' file"
"head -n 8000 file | tail -n 1" \
"mapfile -s 7999 -n 1 ary < file; printf '%s' \"${ary[0]}\"" \
"tail -n 8001 file | head -n 1"; do
echo "$cmd"; for i in {1..100}; do
(time eval "$cmd") 2>&1 | grep -oP 'real.*?m\K[\d\.]+'; done |
awk '{k+=$1}END{print k/100}';
done
sed -n '8000{p;q}' file
0.04502
perl -ne 'print && exit if $. == 8000' file
0.04698
awk 'FNR==8000 {print;exit}' file
0.04647
head -n 8000 file | tail -n 1
0.06842
mapfile -s 7999 -n 1 ary < file; printf '%s' "This is line 8000
"
0.00137
tail -n 8001 file | head -n 1
0.0033
답변3
여러 가지 방법으로 이 작업을 수행할 수 있습니다.
사용 perl
:
perl -nle 'print && exit if $. == 8000' file
사용 awk
:
awk 'FNR==8000 {print;exit}' file
또는 tail
다음 을 사용하여 head
8000행까지 전체 파일을 읽지 못하게 할 수 있습니다.
tail -n +8000 | head -n 1
답변4
당신이 사용할 수있는 sed
:
sed -n '8000p;' filename
파일이 크면 종료하는 것이 좋습니다.
sed -n '8000p;8001q' filename
awk
마찬가지로 전체 파일 읽기를 사용하거나 중지할 수 있습니다 perl
.
awk 'NR==8000{print;exit}' filename
perl -ne 'print if $.==8000; last if $.==8000' filename