行番号でファイルを分割する方法[終了]


94

400k行の長いログファイルを特定の行番号から分割したい。

この質問では、これを300kの任意の数にします。

スクリプト内で)これを実行できるLinuxコマンドはありますか?

私が知っているsplit私は、サイズや行番号のいずれかによって等分にファイルを分割することができますが、それは私が欲しいものではありません。最初の300kを1つのファイルに、最後の100kを2番目のファイルにしたい。

任意の助けいただければ幸いです。ありがとう!

考え直してみると、これはスーパーユーザーまたはサーバー障害サイトに適しています。


16
この質問はここで結構です。シェルスクリプトで解決しようとしているプログラミングタスクがあります。それが広く利用可能なUnixツールを使用するワンライナーである場合、それははるかに優れています!
ジム・ルイス

私も同じだと思いました。しかし、それでも私はシェルスクリプトを作成していませんでした:)まあ、とにかく私の答えを見つけました。ありがとう
デノーマライザ2010年

5
この質問は問題ありません。間違いなく、プログラミングの質問であり、あまりにもローカライズされていません
Peter

9
これはなぜ話題外の質問なのですか?警察はこれまで以上に狂っています。
KarelBílek

6
この質問は少し話題から外れているかもしれませんが、非常に投票されており、そのようなクエリ "linux split file at line"を使用した検索エンジンでの最初の結果です。したがって、この質問をもう一度開いて、他の貴重な回答を追加できるようにすることをお勧めします。または、少なくともSUで最も関連性の高い質問へのリンクを作成します。
Antoine Pinsard

回答:


178
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

また、2番目の考えでは、最初の分割が2番目の分割よりも大きいため、分割はあなたのケースで機能します。Splitは、入力のバランスを最後の分割に入れるので、

split -l 300000 file_name

400kラインの入力に対して、xaa300kラインとxab100kラインで出力します。


ありがとう。スーパーユーザーで同様に回答された質問を見つけました。テールなどを使用します。はい、スプリットは私の例で機能しますが、私の例が常に100Kであったとは限りません。
デノーマライザ2010年

2
Windowsでこれを実行しようとしていてCygwinを使用したくない場合、このプロジェクトは必要なすべてのユーティリティ
Jonathon Hill

15
最初に実行する必要がないtail -n +L file_name > bottom_file場所で使用L=K+1しますwc
Hashbrown

2
私はむしろ使いたいsed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.logです。IHMO、これはより簡単で、行の総数を計算する必要はありません。また、各コマンドの実行の間に行が追加されても機能します。
Antoine Pinsard

一部のファイルについては、この回答は行を省略していますが、Hashbrownによって提案された編集により問題が修正されます。
scharette 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.