tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
head -n 1 file.txt > tmp_file
cat $file >> tmp_file
mv -f tmp_file $file
done
Я удалил wc
, cut
ls
, и echo
в тех местах, где они не нужны. Я изменил некоторые имена файлов, чтобы сделать их немного более значимыми. Я разбил его на несколько строк, чтобы упростить чтение.
Если вы хотите получить фантазию, вы можете использовать mktemp
или tempfile
, чтобы создать временное имя файла вместо использования жесткого кодированного.
Редактировать
Использование GNU split
это можно сделать:
split_filter() { { head -n 1 file.txt; cat; } > "$FILE"; }; export -f split_filter; tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_
Разразившийся для читаемости:
split_filter() { { head -n 1 file.txt; cat; } > "$FILE"; }
export -f split_filter
tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_
Когда --filter
указано, split
запускает команду (а функция в этом случае, которая должна быть экспортирована) для каждого выходного файла и устанавливает v допустимый FILE
, в среде команды, к имени файла.
Скрипт или функция фильтра могут выполнять любые манипуляции, необходимые для содержимого вывода или даже имени файла. Примером последнего может быть вывод в фиксированное имя файла в каталоге переменных: например, > "$FILE/data.dat"
.
Это кажется разумным, что кто-то следует добавить, что в качестве встроенного в особенности 'split' , не так ли? –
Вероятно, самый большой фактор * против *, который становится встроенным, заключается в том, что вы обычно восстанавливаете разделенный файл, выполняя 'cat a b c> rebructed'. Посторонние строки в файле означают, что обычный подход к восстановлению не воспроизводит исходный файл. –
Это то, что нужно для предстоящей (* not *) "' unsplit -remove-header' "утилиты! Но серьезно, 'split', если бы он имел параметр« повторить заголовок », должен по умолчанию по-прежнему выполнять свое текущее поведение. Если бы вы действительно этого хотели, вы использовали бы только заголовок. –