Как разбить один текстовый файл на несколько файлов *.txt?
Я получил текстовый файл file.txt
(12 МБ), содержащий:
something1
something2
something3
something4
(...)
Есть ли способ разделить file.txt
в 12 *.txt файлах скажем file2.txt
, file3.txt
, file4.txt
(...)?
10 ответов
Вы можете использовать утилиту ядра Linux bash split
split -b 1M -d file.txt file
Обратите внимание, что M
или же MB
оба в порядке, но размер отличается. МБ 1000 * 1000, М 1024^2
Если вы хотите разделить на строки, вы можете использовать -l
параметр.
ОБНОВИТЬ
a=(`wc -l yourfile`) ; lines=`echo $a/12 | bc -l` ; split -l=$lines -d file.txt file
Еще одно решение, предложенное Kirill, заключается в следующем:
split -n l/12 file.txt
Обратите внимание, что это l
не one
, split -n
имеет несколько вариантов, как N
, k/N
, l/k/N
, r/N
, r/k/N
,
$ split -l 100 input_file output_file
где -l
количество строк в каждом файле Это создаст:
- output_fileaa
- output_fileab
- output_fileac
- output_filead
- ....
Ответ Джона не даст файлы.txt, как того хочет ОП. Использование:
split -b=1M -d file.txt file --additional-suffix=.txt
Используя bash:
readarray -t LINES < file.txt
COUNT=${#LINES[@]}
for I in "${!LINES[@]}"; do
INDEX=$(( (I * 12 - 1) / COUNT + 1 ))
echo "${LINES[I]}" >> "file${INDEX}.txt"
done
Использование awk:
awk '{
a[NR] = $0
}
END {
for (i = 1; i in a; ++i) {
x = (i * 12 - 1) / NR + 1
sub(/\..*$/, "", x)
print a[i] > "file" x ".txt"
}
}' file.txt
В отличие от split
этот гарантирует, что количество строк наиболее равномерно.
Мой поиск того, как это сделать, привел меня сюда, поэтому я публикую это здесь и для других:
Чтобы получить все содержимое файла,split
это правильный ответ! Но для тех, кто хочет просто извлечь часть файла в качестве образца файла, используйтеhead
илиtail
:
# extract just the **first** 100000 lines of /var/log/syslog into
# ~/syslog_sample.txt
head -n 100000 /var/log/syslog > ~/syslog_sample.txt
# extract just the **last** 100000 lines of /var/log/syslog into
# ~/syslog_sample.txt
tail -n 100000 /var/log/syslog > ~/syslog_sample.txt
Независимо от того, что сказано выше, на моем Ubuntu 16 я должен был сделать:
> split -b 10M -d system.log system_split.log
Обратите внимание на пробел между -b и значением
Попробуйте что-то вроде этого:
awk -vc=1 'NR%1000000==0{++c}{print $0 > c".txt"}' Datafile.txt
for filename in *.txt; do mv "$filename" "Prefix_$filename"; done;
Если каждая часть имеет одинаковый номер строки, например 22, вот мое решение:split --numeric-suffixes=2 --additional-suffix=.txt -l 22 file.txt file
и вы получите file2.txt с первыми 22 строками, file3.txt - со следующей 22 строкой…
Спасибо @hamruta-takawale, @dror-s и @stackruuser2010
Я согласен с @CS Pei, но у меня это не сработало:
split -b=1M -d file.txt file
... как =
после -b
скинул это. Вместо этого я просто удалил его и не оставил пробела между ним и переменной и использовал строчную букву "m":
split -b1m -d file.txt file
И чтобы добавить ".txt", мы используем то, что сказал @schoon:
split -b=1m -d file.txt file --additional-suffix=.txt
У меня был 188,5 МБ текстовый файл, и я использовал эту команду [но с -b5m
для файлов размером 5,2 МБ], и он возвратил 35 разделенных файлов, все из которых были TXT-файлами и 5,2 МБ, за исключением последнего, который составлял 5,0 МБ. Теперь, так как я хотел, чтобы мои строки оставались целыми, я хотел разделить основной файл каждые 1 миллион строк, но split
Команда не позволила мне даже сделать -100000
не говоря уже о "-1000000
, поэтому большое количество строк не будет работать.
В моей системе Linux (Red Hat Enterprise 6.9) split
команда не имеет параметров командной строки для -n
или же --additional-suffix
,
Вместо этого я использовал это:
split -d -l NUM_LINES really_big_file.txt split_files.txt.
где -d
это добавить числовой суффикс в конце split_files.txt.
а также -l
указывает количество строк в файле.
Например, предположим, у меня есть действительно большой файл, подобный этому:
$ ls -laF
total 1391952
drwxr-xr-x 2 user.name group 40 Sep 14 15:43 ./
drwxr-xr-x 3 user.name group 4096 Sep 14 15:39 ../
-rw-r--r-- 1 user.name group 1425352817 Sep 14 14:01 really_big_file.txt
Этот файл содержит 100 000 строк, и я хочу разбить его на файлы, содержащие не более 30 000 строк. Эта команда запустит разделение и добавит целое число в конец шаблона выходного файла. split_files.txt.
,
$ split -d -l 30000 really_big_file.txt split_files.txt.
Получающиеся файлы разделены правильно с максимум 30 000 строк на файл.
$ ls -laF
total 2783904
drwxr-xr-x 2 user.name group 156 Sep 14 15:43 ./
drwxr-xr-x 3 user.name group 4096 Sep 14 15:39 ../
-rw-r--r-- 1 user.name group 1425352817 Sep 14 14:01 really_big_file.txt
-rw-r--r-- 1 user.name group 428604626 Sep 14 15:43 split_files.txt.00
-rw-r--r-- 1 user.name group 427152423 Sep 14 15:43 split_files.txt.01
-rw-r--r-- 1 user.name group 427141443 Sep 14 15:43 split_files.txt.02
-rw-r--r-- 1 user.name group 142454325 Sep 14 15:43 split_files.txt.03
$ wc -l *.txt*
100000 really_big_file.txt
30000 split_files.txt.00
30000 split_files.txt.01
30000 split_files.txt.02
10000 split_files.txt.03
200000 total