Precisa imprimir as linhas correspondentes no arquivo diferente

2

Por exemplo, tenho dados como este

1111111
test1
test2
test3
1111111
block 1
block 2
block 3
1111111
page1
page2
page3

Gostaria de imprimir o conteúdo como arquivos diferentes, conforme mostrado abaixo.

Test1 - File
1111111
test1
test2
test3


Block - File2
1111111
block 1
block 2
block 3


Page - File3
1111111
page1
page2
page3
    
por Kiran Kumar Vemulapalli 20.07.2015 / 10:41

4 respostas

3

Você quer dividir este arquivo em 11111111 , correto?

Tente

awk -vRS=1111111 'NR>1{print RS$0 >"file"NR-1}' file
    
por 20.07.2015 / 12:01
2
csplit -zf file file.txt /^1111111/ "{*}"

csplit (coreutils) é um bom comando para dividir um arquivo por linhas de contexto, (número de linhas, padrões)

    
por 20.07.2015 / 14:00
2

Outro possível awk sem cabeçalhos nos arquivos:

awk '/^1111111/ { close("file" i); i++; } { print > "file" i; }' file

E o segundo com cabeçalhos, já que eu suponho que os cabeçalhos são construídos a partir do primeiro campo após 1111111 , embora o último não pareça ser assim:

awk '/^1111111/ { close(f); i++; s = $1; next; } { if (s) { f = "file" i; header = toupper(substr($1, 1, 1)) substr($1, 2)  " - File" i; print header ORS s > f; s = ""; } print > f; }' file
    
por 20.07.2015 / 12:05
0

Isso deve funcionar para você

#!/usr/bin/perl

use strict;
use warnings;


my$in=shift(@ARGV);
my$filecount=0;
my$open=0;

open(IN,'<',$in) or die $!;
while(<IN>) #reading input file
{
    if($_=~/^111/) #start new output file, if a line begins with multiple 1s
    {
        close OUT or die $! if $open==1;
        $filecount++;
        open(OUT,'>','out-'.$filecount.'.txt') or die $!;
        $open=1;
        print OUT $_;
    }
    else
    {
        print OUT $_;
    }
}
close IN or die $!;
close OUT or die $!;

Tenho certeza de que existem formas mais eficientes, mas esta foi a primeira que me veio à mente: -)

    
por 20.07.2015 / 11:11