Я получил текстовый файл file.txt
(12 МБ), содержащий:
something1
something2
something3
something4
(...)
Есть ли способ разделить file.txt
на 12 *.txt файлы, скажем file2.txt
, file3.txt
, file4.txt
(...)?
Я получил текстовый файл file.txt
(12 МБ), содержащий:
something1
something2
something3
something4
(...)
Есть ли способ разделить file.txt
на 12 *.txt файлы, скажем file2.txt
, file3.txt
, file4.txt
(...)?
Вы можете использовать утилиту linux bash core split
split -b=1M -d file.txt file
Обратите внимание, что M
или MB
оба в порядке, но размер отличается. МБ - 1000 * 1000, М - 1024 ^ 2
Если вы хотите разделить по строкам, вы можете использовать параметр -l
.
UPDATE
a=(`wc -l yourfile`) ; lines=`echo $a/12 | bc -l` ; split -l=$lines -d file.txt file
$ split -l 100 input_file output_file
где -l
- количество строк в каждом файле. Это создаст:
Ответ Джона не будет создавать файлы .txt по желанию OP. Использование:
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
, это гарантирует, что количество строк наиболее четное.
Независимо от того, что было сказано выше, на моем 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
для имени файла в *.txt; do mv "$ filename" "Prefix_ $filename"; сделано;
Я согласен с @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
У меня был txt файл 188,5 МБ, и я использовал эту команду [но с -b5m
для файлов с 5.2 МБ], и он вернул 35 разделенных файлов, все из которых были txt файлами и 5.2MB, за исключением последнего, который был 5.0MB. Теперь, поскольку я хотел, чтобы мои строки оставались целыми, я хотел разбить основной файл каждые 1 миллион строк, но команда split
не позволяла мне даже делать -100000
не говоря уже о -1000000
, поэтому большие числа линий для разделения не будет работать.