2013-09-26 6 views

ответ

32

Вы можете использовать Ядро Linux утилиту Баш split

split -b 1M -d file.txt file 

Обратите внимание, что M или MB оба они хорошо, но размер отличается. MB - 1000 * 1000, M - 1024^2

Если вы хотите разделить по строкам, вы можете использовать параметр -l.

UPDATE

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 не 1, split -n имеет несколько вариантов, как N , k/N, l/k/N, r/N, r/k/N.

+0

Можете ли вы уточнить, как можно было убедиться, что количество файлов даже без разделения строк в нем просто с помощью 'split'? – konsolebox

+0

вы можете использовать' wc -l', чтобы получить общие строки и запустить что-то вроде этого 'a = (' wc -l yourfile'); lines = 'echo $ a/12 | bc -l'; split -l = $ lines -d file.txt file' –

+0

Со всеми этими сложностями вы могли бы просто используйте awk, и это не сработает с не-файловым вводом, который не позволит дважды читать данные. Просто заявив, что ваше предыдущее утверждение о том, что 'split' может это сделать, не совсем корректно. И, как и ожидалось, вы использовали' wc'. – konsolebox

1

Использование баш:

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 это один убеждается, что количество строк наиболее даже.

+1

'split' может сделать это тоже –

+0

@JohnSmith Да не видел этот вариант быстро. – konsolebox

+0

@JohnSmith Я беру это обратно. Как мы уверены, что линии четные? Без использования 'wc -l' и вычисления его, конечно, иначе мы могли бы просто использовать bash или awk. И это на самом деле причина, почему я сделал сценарий и не рассматривал split. – konsolebox

41
$ split -l 100 input_file output_file 

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

  • output_fileaa
  • output_fileab
  • output_fileac
  • output_filead
  • ....
+0

Как он выбирает aa, ab, ac ...? –

+1

@ T.BrianJones его ухаживает за сплитом – viru

9

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

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

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

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

Пожалуйста, обратите внимание на пробел между -b и значением

+0

Не будет ли создавать 'system_split.log1',' system_split.log2' и т. Д. Без опции «дополнительный-суффикс»? –

+0

Да, это сделает –

0

Попробуйте что-то вроде этого:

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

for filename in *.txt; do mv "$filename" "Prefix_$filename"; done; 
0

Я согласен с @CS Пей, однако это не работает для меня:

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

... как = после -b бросил его. Вместо этого я просто удалил его и не оставляют пространства между ним и переменной, и используется в нижнем регистре «М»:

split -b1m -d file.txt file

И добавляемых «.txt», мы используем то, что @schoon сказал:

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

у меня был файл 188.5MB текстового и я использовал эту команду [но с -b5m для 5.2MB файлов], и он вернулся 35 разделять файлы, все из которых были текстовые файлы и 5.2Mb, кроме последнего, который был 5.0Mb , Теперь, поскольку я хотел, чтобы мои строки оставались целыми, я хотел разделить основной файл каждые 1 миллион строк, но команда split не позволяла мне даже делать -100000, не говоря уже о «-1000000, поэтому большое количество строк для разделения не будет работа

Смежные вопросы