web-dev-qa-db-ja.com

テキストファイルの行の中央セクションを抽出しますか?

私はPHPスクリプトを記述して、大きなテキストファイルを解析してそこからデータベースを挿入します。しかし、私のホストでは、ファイルが大きすぎて、PHPのメモリ制限に達しました。

ファイルには約16,000行あります。それをロードできるかどうかを確認するために、(最初は)4つの個別のファイルに分割したいと思います。

head -4000 file.txtで取得できる最初の部分。中央のセクションは少しトリッキーです-tail出力をheadtail -4001 file.txt | head -4000 > section2.txt)にパイプすることを考えていましたが、別の/より良い方法はありますか?

実際、私のロジックはめちゃくちゃです-セクション2の場合、tail -12001 file.txt | head - 4000のようにして、次のセクションのtail引数を下げる必要があります。私はすでに混乱しています! :P

19
user394

めちゃくちゃにしたくないが、それでもtailheadを使用する場合は、最初から行数を使用してtailを呼び出す便利な方法があります。終わり:

tail -n +4001 yourfile | head -4000

...しかし、ファイルを分割するためだけに作成されたより良い自動ツールが呼び出されます... split!これはGNU coreutilsの一部でもあるので、通常のLinuxシステムには必要です。使用方法は次のとおりです。

split -l 4000 yourInputFile thePrefixForOutputFiles

(見る man split疑問がある場合。)

27
rozcietrzewiacz

あなたがしたように頭と尾を組み合わせることはうまくいきますが、これのために私はsedを使用します

sed -n '1,4000p' input_file # print lines 1-4000 of input_file

これにより、迅速なシェル機能で問題を解決できます

chunk_it(){
    step=4
    start=1
    end=$step
    for n in {1..4} ; do
        sed -n "${start},${end}p" "$1" > "$1".$start-$end
        let start+=$step
        let end+=$step
    done
}

chunk_it your_file

これで、your_file.1-4000とyuor_file.4001-8000などになります。

注:bashが必要です

19
Sorpigal