У мене великий файл і потрібно розділити його на два файли. Припустимо, в першому файлі слід вибрати 1000 рядків і помістити в інший файл і видалити ці рядки з першого файлу.
Я спробував використовувати, split
але це створює кілька фрагментів.
У мене великий файл і потрібно розділити його на два файли. Припустимо, в першому файлі слід вибрати 1000 рядків і помістити в інший файл і видалити ці рядки з першого файлу.
Я спробував використовувати, split
але це створює кілька фрагментів.
Відповіді:
Найпростіший спосіб, ймовірно , для використання head
і tail
:
$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2
Це поставить перші 1000 рядків input-file
зсередини output1
, а всі рядки від 1001 до кінцяoutput2
Я думаю, що split
це найкращий підхід.
Спробуйте скористатись -l xxxx
опцією, де xxxx - це кількість рядків, які потрібно у кожному файлі (за замовчуванням - 1000).
Ви можете використовувати цю -n yy
опцію, якщо вас більше турбує кількість створених файлів. Використання -n 2
розділить ваш файл лише на 2 частини, незалежно від кількості рядків у кожному файлі.
Ви можете порахувати кількість рядків у вашому файлі wc -l filename
. Це команда 'wordcount' з опцією рядки.
man split
man wc
split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??
.
Це робота для 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
csplit
. Дуже хороша. (Я просто читаю список команд POSIX, і спочатку виникли величезні проблеми з обгортанням голови навколо csplit
мети команди. Виявляється, це дійсно просто.) :)
Простий спосіб зробити те, що запитує, за допомогою однієї команди:
awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile
або для тих, хто насправді ненавидить набирати довгі, інтуїтивно зрозумілі команди,
awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
split --help
?