特定の行でファイルを2つのファイルに分割する


12

UNIXで、指定された行番号でファイルを2つのファイルに分割する方法を探しています。

split -l 100 file_nameは私が探しているものに近いですが、このコマンドはそれぞれ100行の複数のファイルを作成します。指定された行番号でファイルを2つのファイルに分割するコマンドを探しています。UNIXでこれを行う方法はありますか?

回答:


12

少し厳しいソリューション:

(head -100 > f1.txt; cat > f2.txt) < input.txt

1
素晴らしい解決策。wc以前とはカウントせず、awkソリューションと同様に、入力ファイルはまだ一度だけ処理されます。
Dubu 2013

2
headに出力する最初の100行を見つけるために、わずか100行を超える可能性がありf1.txtます。これらの余分なバイトは、からは見えませんcat
chepner

これは非常に遅いです
sdaffa23fdsf

12

を使用するawkと、入力ファイルを1回だけ通過する必要があります。次の例では、最初のファイルの最初の122行と、残りの2行目が必要であると想定しています。

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name

これは高く評価するに値します。XからYにファイルを分割する場合は、これが最も簡単です。
Glenn Plas

これは、理解する最も簡単なソリューションです。魅力のように動作しました...そして、私が1999年以降に持ってきた私のO'Reilly Sed&Awkの本のほこりを払拭する必要があると思います、sedセクションはよく読まれていますが、awkセクションはそれほどではありません。
マイケル

@chepnerがコメントで言及した理由により、これは例外的なソリューションよりも優れています。「f2.txt」ファイルの文字が失われます。このソリューションは正確で効率的です。awk ftw。
ゴラン

7

とを使用headtailて、両方の部分を取得できます。

head -n K file_name > top_file
tail -n L file_name > bottom_file

ここKで、は行番号で、Lは下からの行数です(合計行数- K)。

(行数はを使用して取得できますwc -l file_name)。


5

csplit(可能な場合)を使用してそれを行うことができます:

csplit file N+1

ファイルを2つの部分に分割します。1つは行番号まで(および行番号を含む)、もう1つは行番号NからN+1最後の行までです。
行番号まで(ただし行番号を含まない)分割したい場合N

csplit file N

それは素晴らしい!おかげで、問題は完全に解決されました。
Zertrin、2016年

20GBファイルを分割するのに最適なパフォーマンス。
dr0i

@ dr0i-不思議でcsplitはありません。このジョブ用に最適化されています。
don_crissti

分割200Mライン-ファイル私はそれが動作2011に日付csplitコマンドを使用して、2008年にcsplitは時代遅れバックを使用して、「メモリが枯渇」:)だ
dr0i

4

両方headtail、彼らは他の場合よりもファイルの「その他」の端から生産ラインにオプションを持っています。したがって、次の2つのオプションがあります。

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

または(NNNはの出力より100小さいwc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

お使いのバージョンのheadおよびtail詳細については、マニュアルページを参照してください。


0

「wc」、「dc」、「head」、「tail」を使用できます。すなわち

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

使いやすくするために、上記をシェルスクリプトに変えることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.