2

Я хочу разбить файл на равные части так, чтобы последний файл получал оставшиеся записи в Unix. Например: файл имеет 4 строки, я хочу разделить на 4 файла = удивительно. 1 строка на файл.

У меня 5 строк, я хочу разбить на 4 файла. То, что я действительно хочу здесь, это:

File - number of lines;
f1 - 1;
f2 - 1;
f3 - 1;
f4 - 2;

Возможно ли это даже через прямую команду split в Unix? Я думаю, что невозможно без некоторого дополнительного итеративного кодирования вокруг раскола?

Вот что я попробовал:

numsplitfile=$parm (lets say 4)
total_lines=$(wc -l < $inputfile) (lets say the file has 5 lines)
lines_per_file = (total_lines + numsplitfile - 1) / numsplitfile)
split -l $lines_per_file $inputfile splitfilename

Что он делает, так это то, что он преобразуется в:

split -l 2 $inputfile splitfilename

отсюда и 3 файла по 2, 2, 1 строки в каждом. Но я хочу 1, 1, 1, 2 строки в 4 файлах.

1 ответ1

0

Похоже, вы не сможете сделать это только с помощью команды split, но вы можете обойти это.
Попробуйте что-то вроде этого:

#!/bin/bash
inputfile=$1
parts=$2
total_lines=$(wc -l < "$inputfile")
lines_per_file=$[$total_lines / $parts]

rm out*  2>/dev/null
split -d -l $lines_per_file "$inputfile" out

extra_files=$(printf "out%02i\n" `seq $parts $[$parts * 2 - 1]`)
last_file=$(printf "out%02i\n" $[$parts - 1])
cat $extra_files >> $last_file   2>/dev/null  # ignore errors
rm  $extra_files                 2>/dev/null  # ignore errors

Назовите его split_file тогда вы можете назвать его так:

$ ./split_file input_file 4

Сплит файлы будут называться out00 out01 out02 т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .