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


17

私は、大きなテキストファイルを解析して、そこからデータベースの挿入を行う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

回答:


27

あなたがめちゃくちゃを取得しないようにしたいが、まだ使用してそれを行う場合tailhead、呼び出すのに便利な方法がありtail、最初からラインカウントではなく、エンドを使用しては:

tail -n +4001 yourfile | head -4000

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

split -l 4000 yourInputFile thePrefixForOutputFiles

man split疑わしい場合は参照してください。)


19

あなたがやったように頭と尾を組み合わせて動作しますが、このために私は使用します 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が必要です


3
私はsedの方法が好きです。
ファンキーナ

sedが終了しないため、これは機能しません。stdoutにしたい行を出力しますが、ctrl-cを出力する必要があり、その結果、ファイルにリダイレクトできません。それを使用可能にするための提案はありますか?
Brent212

理解した!「sed -n '<start_line>、<end_line> w <output_file>' <input_file>」が機能します。
Brent212

@ Brent212注意すべきもう1つのオプションは、それをlessにパイプしたり、出力をファイルにリダイレクトしたりできることです。
カイルの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.