파일에서 특정 줄을 얻는 방법은 무엇입니까? [복사]

파일에서 특정 줄을 얻는 방법은 무엇입니까? [복사]

매우 큰 파일에서 정확한 줄을 추출하고 싶습니다. 예를 들어 8000행은 다음과 같습니다.

command -line 8000 > output_line_8000.txt

답변1

perl그리고 이미 답을 갖고 있습니다 awk. 대답 은 다음과 같습니다 sed.

sed -n '8000{p;q}' file

이 명령의 장점은 8000행을 읽은 후 종료된다는 q것입니다 ( 다른 방법 달리 (공동 창의성을 통해 수정됨, 하하)).sedperlawk

순수 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다음 을 사용하여 head8000행까지 전체 파일을 읽지 못하게 할 수 있습니다.

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

관련 정보