파일에서 지정된 범위의 행을 읽습니다.


15

나는 리눅스에서 라인 # 5555에서 라인 # 7777로 라인을 얻는 방법에 100000 라인을 포함하는 파일을 가지고있다.

모두 감사합니다.

linux  files  sed 

1
@ibrahim, 도움이된다면 Kyle의 답변을 수락하는 것을 고려하십시오 (왼쪽의 녹색 체크 표시를 체크)
Jonik

sed를 사용하고 싶거나 다른 도구가 정상이라면 정확할 수 있습니다.
Manu H

답변:


22
sed '5555,7777!d' <filename>

파일의 5555-7777 행을 포함하여 인쇄합니다.

Dennis 다음과 같이 게시했습니다.

sed '5555,7777p; 7778q' filename

다음은 더 빨라야한다는 증거입니다.

$ n=1
$ while [[ n -le 100000 ]]; do echo $n >> sedtest2; n=$((n + 1)); done
$ strace -e trace=read -o sed1 sed '5555,7777!d' sedtest2
$ strace -e trace=read -o sed2 sed '5555,7777p; 7778q' sedtest2
$ wc -l sed1
149 sed1
$ wc -l sed2
14 sed1

배쉬에서만 (재미를 위해) :

n=1
while read line; do 
    if [[ ($n -ge 5555) && ($n -le 7777)  ]]; then 
        echo $line
    elif [[ $n -gt 7777 ]]; then
        break
    fi 
    n=$(( $n + 1 ))
done < file

$n -gt 3아마도 당신 은 7777이어야 한다고 생각 합니까? 또한 if (( n >= 5555 ))보다 "자연스러운"수치 비교 연산자 (및 달러 기호를 제거하는 기능)를 수행 할 수 있습니다 . 그리고 당신은 할 수 있습니다 ((n++)).
추후 공지가있을 때까지 일시 중지되었습니다.


7

이들 중 하나가 작동해야합니다.

  • SED -n ' startnumber , endnumber의 P'
  • awk 'NR> = 시작 번호 && NR <= endnumber '파일

그건 그렇고 좋은 질문;)


1

sed 옵션이 mysqldump 파일에서 작동하지 않는다는 것을 알았습니다. 따옴표로 묶은 줄 바꿈이나 멀티 바이트 문자를 처리했기 때문에 추측하고 있습니다. 머리와 꼬리는 grep과 같은 줄 번호를 사용하여 슬라이스했습니다. $ j에서 $ k까지 줄을 얻으려면 다음이 필요합니다.

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.