Розділіть файл на дві частини


18

У мене великий файл і потрібно розділити його на два файли. Припустимо, в першому файлі слід вибрати 1000 рядків і помістити в інший файл і видалити ці рядки з першого файлу.

Я спробував використовувати, splitале це створює кілька фрагментів.


Ви перевірили split --help?
Брайам

Так, я перевірив це, але створює кілька файлів, які мені не потрібні.
Аравінд

Відповіді:


31

Найпростіший спосіб, ймовірно , для використання headі tail:

$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2

Це поставить перші 1000 рядків input-fileзсередини output1, а всі рядки від 1001 до кінцяoutput2


13

Я думаю, що splitце найкращий підхід.

Спробуйте скористатись -l xxxxопцією, де xxxx - це кількість рядків, які потрібно у кожному файлі (за замовчуванням - 1000).

Ви можете використовувати цю -n yyопцію, якщо вас більше турбує кількість створених файлів. Використання -n 2розділить ваш файл лише на 2 частини, незалежно від кількості рядків у кожному файлі.

Ви можете порахувати кількість рядків у вашому файлі wc -l filename. Це команда 'wordcount' з опцією рядки.

Список літератури

  • man split
  • man wc

1
Це як розділити на купу файлів із фіксованою кількістю рядків, або як рівномірно розділити на фіксовану кількість файлів. Чи є спосіб розділити один файл 1000 рядків і один файл з усім іншим? Ось що він просив; Я не зміг його знайти на сторінці чоловіка
Michael Mrozek

Ти правильний, Майкл. Я думаю, я взяв спрощений погляд на це питання. Ви рішення найкраще в цьому випадку. Іншим способом було б використання команди 'sed': sed -n 1,1000 originalfile> first_1000_lines. sed '1,1000d' оригінальний файл> залишилися_лінії.
Люсьєн Ворон

Звичайно, ви могли б зробити split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??.
G-Man каже: "Відновіть Моніку"

8

Це робота для csplit:

csplit -s infile 1001 

буде sрозрізнено infile, перший фрагмент xx00- до, але не включаючи рядок 1001, а другий xx01- інші рядки.
Ви можете грати з параметрами, якщо вам потрібні різні назви вихідних файлів, наприклад, використовуючи -fта вказуючи префікс :

csplit -sf piece. infile 1001 

створює два файли з ім'ям piece.00таpiece.01


З розумним headви також можете зробити щось на кшталт:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile

1
Нічого собі, це дійсно є роботою для csplit. Дуже хороша. (Я просто читаю список команд POSIX, і спочатку виникли величезні проблеми з обгортанням голови навколо csplitмети команди. Виявляється, це дійсно просто.) :)
Wildcard

4

Простий спосіб зробити те, що запитує, за допомогою однієї команди:

awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile

або для тих, хто насправді ненавидить набирати довгі, інтуїтивно зрозумілі команди,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.