Mesclando dois arquivos diferentes com condições

1

Eu tenho dois arquivos diferentes, conforme mostrado abaixo.

Conteúdo de a.txt :

HDR|1||||||||||               
DTL|@|||||||||||             
TLR|||||||||||||              
HDR|1||||||||||||            
DTL|||||||||||||              
TLR|||||||||||||     

Conteúdo de b.txt :

HDR|2||||||||||  
DTL|||||||||||||
TLR|||||||||||||
HDR|2|||||||||||| 
DTL|last||||||||||||
TLR|||||||||||||

Aqui eu tenho que tirar todas as linhas até o primeiro "TLR" em a.txt e b.txt e fundir em 1.txt , da mesma forma, retire todas as linhas Após o primeiro "TLR" em a.txt e b.txt e mesclar em 2.txt

a saída deve ser:

Conteúdo de 1.txt :

HDR|1|||||||||| 
DTL|@||||||||||| 
TLR|||||||||||||
HDR|2|||||||||| 
DTL|||||||||||| 
TLR|||||||||||||  

Conteúdo de 2.txt :

HDR|1|||||||||| 
DTL|||||||||||| 
TLR|||||||||||||
HDR|2|||||||||| 
DTL|last||||||||||| 
TLR|||||||||||||  

Como podemos realizar isso usando o Script do UNIX?

    
por UNIXbest 03.01.2014 / 09:41

2 respostas

1

Uma maneira de fazer isso:

sed -ne '1,/^TLR/p' a.txt > 1.txt
sed -ne '1,/^TLR/p' b.txt >> 1.txt
sed -e '1,/^TLR/d' a.txt > 2.txt
sed -e '1,/^TLR/d' b.txt >> 2.txt

Isto é:

  • Imprima as linhas de a.txt até corresponder a /^TLR/ e criar 1.txt
  • Imprima as linhas de b.txt até coincidir /^TLR/ e anexar a 1.txt
  • Solte as linhas de a.txt até corresponder a /^TLR/ e criar 2.txt
  • Solte as linhas de b.txt até coincidir /^TLR/ e acrescentar a 2.txt
por 03.01.2014 / 09:50
1

Você pode executar o mesmo comando duas vezes nos dois arquivos diferentes:

$ perl -ne 'print if $a<1; $a++ if /TLR/; ' a.txt > 1.txt
$ perl -ne 'print if $a<1; $a++ if /TLR/; ' b.txt >> 1.txt

e

$ perl -ne 'print if $a>=1; $a++ if /TLR/; ' a.txt > 2.txt
$ perl -ne 'print if $a>=1; $a++ if /TLR/; ' b.txt >> 2.txt

Esses scriptlets simples adicionarão 1 ao valor da variável $a se a linha atual contiver TLR . Em seguida, eles verificam o valor de $a para decidir se essa linha deve ser impressa ou não.

Você pode combinar as duas operações em um comando com:

$ perl -e '
  foreach my $file(@ARGV){
    open(my $fh,"$file"); $a=0;
    while(<$fh>){
     $a<1 ? (push @{$lines{1}},$_) : (push @{$lines{2}},$_); $a++ if /TLR/}} 
  END{open(my $fh,">","1.txt"); print $fh @{$lines{1}}; 
      open(my $fh,">","2.txt"); print $fh @{$lines{2}};}' a.txt b.txt
    
por 03.01.2014 / 13:38