Подтвердить что ты не робот

Как разбить один текстовый файл на несколько файлов *.txt?

Я получил текстовый файл file.txt (12 МБ), содержащий:

something1
something2
something3
something4
(...)

Есть ли способ разделить file.txt на 12 *.txt файлы, скажем file2.txt, file3.txt, file4.txt (...)?

4b9b3361

Ответ 1

Вы можете использовать утилиту 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

Ответ 2

$ split -l 100 input_file output_file

где -l - количество строк в каждом файле. Это создаст:

  • output_fileaa
  • output_fileab
  • output_fileac
  • output_filead
  • ....

Ответ 3

Ответ Джона не будет создавать файлы .txt по желанию OP. Использование:

split -b=1M -d  file.txt file --additional-suffix=.txt

Ответ 4

Использование 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, это гарантирует, что количество строк наиболее четное.

Ответ 5

Независимо от того, что было сказано выше, на моем ubuntu 16 я должен был сделать:

> split -b 10M -d  system.log system_split.log 

Обратите внимание на пробел между -b и значением

Ответ 6

awk -vc = 1 'NR% 1000000 == 0 {++ c} {print $0 > c ".txt" }' Datafile.txt

для имени файла в *.txt; do mv "$ filename" "Prefix_ $filename"; сделано;

Ответ 7

Я согласен с @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, поэтому большие числа линий для разделения не будет работать.