У меня большой файл, и мне нужно разбить его на два файла. Предположим, что в первом файле следует выбрать 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» с опцией lines.
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
?