Как разделить файл и сохранить первую строку в каждой из частей?

Сделайте Вы имеете в виду что-то вроде этого:

function Animal() {
  //Initialization for all Animals
}

//Function and properties shared by all instances of Animal
Animal.prototype.init=function(name){
  this.name=name;
}
Animal.prototype.say=function(){
    alert(this.name + " who is a " + this.type + " says " + this.whattosay);
}
Animal.prototype.type="unknown";

function Cat(name) {
    this.init(name);

    //Make a cat somewhat unique
    var s="";
    for (var i=Math.ceil(Math.random()*7); i>=0; --i) s+="e";
    this.whattosay="Me" + s +"ow";
}
//Function and properties shared by all instances of Cat    
Cat.prototype=new Animal();
Cat.prototype.type="cat";
Cat.prototype.whattosay="meow";


function Dog() {
    //Call init with same arguments as Dog was called with
    this.init.apply(this,arguments);
}

Dog.prototype=new Animal();
Dog.prototype.type="Dog";
Dog.prototype.whattosay="bark";
//Override say.
Dog.prototype.say = function() {
        this.openMouth();
        //Call the original with the exact same arguments
        Animal.prototype.say.apply(this,arguments);
        //or with other arguments
        //Animal.prototype.say.call(this,"some","other","arguments");
        this.closeMouth();
}

Dog.prototype.openMouth=function() {
   //Code
}
Dog.prototype.closeMouth=function() {
   //Code
}

var dog = new Dog("Fido");
var cat1 = new Cat("Dash");
var cat2 = new Cat("Dot");


dog.say(); // Fido the Dog says bark
cat1.say(); //Dash the Cat says M[e]+ow
cat2.say(); //Dot the Cat says M[e]+ow


alert(cat instanceof Cat) // True
alert(cat instanceof Dog) // False
alert(cat instanceof Animal) // True
58
задан Arkady 11 September 2009 в 15:49
поделиться

5 ответов

Это скрипт robhruska , немного очищенный:

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 и эхо там, где они не нужны. Я изменил некоторые имена файлов, чтобы сделать их более значимыми. Я разбил его на несколько строк только для того, чтобы его было легче читать.

Если хотите, можете использовать 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 запускает команду (в данном случае функция, который должен быть экспортирован) для каждого выходного файла и устанавливает для переменной FILE в среде команды имя файла.

Сценарий или функция фильтра могут выполнять любые манипуляции с выходным содержимым или даже имя файла. Примером последнего может быть вывод в фиксированное имя файла в каталоге переменных: > "$ FILE / data.dat" например.

49
ответ дан 24 November 2019 в 19:00
поделиться

Я новичок, когда дело касается Баш-фу, но мне удалось придумать это чудовище с двумя командами. Я уверен, что есть более элегантные решения.

$> tail -n +2 file.txt | split -l 4
$> for file in `ls xa*`; do echo "`head -1 file.txt`" > tmp; cat $file >> tmp; mv -f tmp $file; done

Предполагается, что ваш входной файл - file.txt , вы не используете аргумент префикса для split , и вы работаете в каталоге, в котором нет других файлов, начинающихся с формата вывода по умолчанию xa * split . Также замените "4" желаемым размером линии разделения.

7
ответ дан 24 November 2019 в 19:00
поделиться

Это более надежная версия сценария Дениса Уильямсона . Скрипт создает множество временных файлов, и было бы обидно, если бы они остались лежать без дела, если запуск был неполным. Итак, давайте добавим захват сигнала (см. http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html , а затем http://tldp.org/LDP/ abs / html / debugging.html ) и удалите наши временные файлы; в любом случае это лучшая практика.

trap 'rm split_* tmp_file ; exit 13' SIGINT SIGTERM SIGQUIT 
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

Замените «13» любым кодом возврата. О, и вам, вероятно, в любом случае следует использовать mktemp (как некоторые уже предлагали), так что продолжайте и удалите 'tmp_file' из rm в строке прерывания. Дополнительные сигналы для перехвата смотрите на странице руководства по сигналам.

2
ответ дан 24 November 2019 в 19:00
поделиться

Я никогда не уверен в правилах копирования скриптов прямо с чужих сайтов, но Geekology предлагает хороший скрипт, чтобы делать то, что вы хотите, с несколькими подтверждающими комментариями что это работает. Обязательно выполните tail -n +2 , как указано в комментарии внизу.

1
ответ дан 24 November 2019 в 19:00
поделиться

Вы можете использовать [mg] awk:

awk 'NR==1{
        header=$0; 
        count=1; 
        print header > "x_" count; 
        next 
     } 

     !( (NR-1) % 100){
        count++; 
        print header > "x_" count;
     } 
     {
        print $0 > "x_" count
     }' file

100 - это количество строк в каждом срезе. Он не требует временных файлов и может быть помещен в одну строку.

10
ответ дан 24 November 2019 в 19:00
поделиться