Как разбить один текстовый файл на несколько файлов *.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
Другие вопросы по тегам