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


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.