web-dev-qa-db-ja.com

ファイルから指定された範囲の行を読み取る

Linuxでline#5555からline#7777までの行を取得するには、100000行を含むファイルがあります。

全てに感謝。

15
ibrahim
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

Bashのみ(楽しみのため):

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
22
Kyle Brandt

完了したら終了すると、処理が速くなります。

sed -n '5555,7777p; 7778q' input_file

これらのどちらでも機能するはずです。

  • sed -n '開始番号終了番号 p'
  • awk 'NR> = startnumber && NR <= endnumber'ファイル

ところで素晴らしい質問;)

7
Chopper3

引用された改行またはマルチバイト文字の処理が原因で、sedオプションがmysqldumpファイルで機能しないことがわかりました。頭と尾は、grepと同じ行番号を使用してスライスしました。 $ jから$ kまでの行を取得するには、次のものが必要です。

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
1
Dave Crooke