Розділіть файл на два файли у заданому рядку


12

Я шукаю спосіб в unix розділити файл на два файли за заданим номером рядка.

split -l 100 file_nameблизький до того, що я шукаю, але ця команда створює кілька файлів, кожен із 100 рядків. Я шукаю команду розділити файл на два файли за заданим номером рядка. Чи є спосіб це зробити в unix?

Відповіді:


13

Трохи жорсткіше рішення:

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

1
Приємне рішення. Не рахується wcраніше, і вхідний файл все ще обробляється лише один раз, як і awkрішення.
— Дубу

2
Існує невеликий шанс, що headпрочитає більше 100 рядків, щоб знайти перші 100 рядків для виведення f1.txt; ці зайві байти не побачать cat.
— чепнер

Це так
— чортово

12

Використовуйте awkтак, що вам потрібно зробити лише один прохід через вхідний файл. Далі передбачається, що ви хочете, щоб перші 122 рядки були в першому файлі, а решта - у другому.

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

Це заслуговує великих пальців вгору. якщо ви хочете розділити файл з X на Y, це найпростіше.
— Glenn Plas

Це найпростіше зрозуміти рішення. Працював як шарм ... і змушує мене думати, що я маю вимити пил з моєї книги O'Reilly Sed & Awk, яку я мав з 1999 року або близько того, розділ sed добре прочитаний, awk розділ не так сильно.
— Майкл

Це краще, ніж виключене рішення з причини, яка @chepner зазначала у коментарях. Ви втратите символи у файлі 'f2.txt'. Це рішення є точним та ефективним. awk ftw.
— Горан

7

Ви можете використовувати headта tailотримати обидві частини:

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

розділить файл на дві частини, одна частина - до (включаючи) номера рядка, Nа інша частина - від номера рядка N+1до останнього рядка.
Якщо ви хочете розділити на (але не включаючи) номер рядка N:

csplit file N

Це чудово! Дякую, це вирішило проблему ідеально для мене.
— Зертрін

Найкраща продуктивність для розбиття файлу 20 Гб на частини.
— dr0i

@ dr0i - недарма, csplit оптимізовано для цієї роботи.
— don_crissti

Розщеплення файлу 200M-рядків у мене "вичерпано пам'ять" за допомогою csplit від 2008 року. Використання csplit від 2011 року працює :)
— dr0i

4

Як headі tailє варіанти , щоб зробити лінії від «іншого» кінця файлу , ніж вони могли б. Отже, у вас є два варіанти:

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

Для зручності використання ви можете перетворити вище на сценарій оболонки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.