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

18

У меня большой файл, и мне нужно разбить его на два файла. Предположим, что в первом файле следует выбрать 1000 строк, поместить их в другой файл и удалить эти строки в первом файле.

Я пытался использовать, splitно это создает несколько кусков.

Аравиндом
источник
Вы проверяли split --help?
Брайам
Да, я проверил это, но создаю несколько файлов, которые мне не нужны.
Аравинд

Ответы:

30

Самый простой способ, вероятно, использовать 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» с опцией lines.

Ссылки

  • man split
  • man wc
Люсьен Ворон
источник
1
Это как разделить на несколько файлов с фиксированным количеством строк, или как равномерно разделить на фиксированное количество файлов. Есть ли способ разбить на один 1000-строчный файл и один файл со всем остальным? Это то, что он просил; Я не смог найти его на странице руководства
Майкл Мрозек
Вы правы, Майкл. Я думаю, что я принял упрощенный взгляд на вопрос. Ваше решение является лучшим в этом случае. Другой способ - использовать команду sed: sed -n 1,1000 originalfile> first_1000_lines. sed '1,1000d' originalfile> Остальные_линии.
Люсьен Ворон
Конечно, вы могли бы сделать 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
don_crissti
источник
1
Ничего себе, это действительно является работой для csplit. Очень хорошо. (Я просто читаю список команд POSIX, и у меня возникли огромные проблемы, когда я csplitсначала обдумывал назначение команды. Оказывается, это действительно очень просто.) :)
Wildcard
4

Простой способ сделать то, что требует вопрос, в одной команде:

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

или для тех из вас, кто действительно ненавидит вводить длинные интуитивно понятные команды,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
G-Man говорит: «Восстанови Монику»
источник