Encontre a linha e acrescente a parte inferior do arquivo

0

Eu tenho um arquivo grande com algum registro que terá valores diferentes dos outros.

Arquivo de dados real:

000000106500000000000129201300000U1E4600000060000+00000020400+00000002532+000000
0000001065000000000001182013000010144700002090000+00000335156+00000006776+000000
0000001065000000000003012014999999999924835390500+07164327872+00447479302+000000
0000001065000000000001102013000004QE8200000150000+00000056450+000000021

$ grep -n "9999999999" BADINS0000001065_000000000020140301.dat

Eu queria anexar esse registro no final do arquivo, simplesmente se eu tivesse ~ 100 registros no arquivo se a minha posição de gravação estivesse em algum lugar do arquivo, tenho que encontrar, remover desse local (completamente) e precisar ser acrescentado ao final do arquivo (parte inferior do arquivo).

Existem muitos arquivos no diretório que desejo automatizar esse processo para cada execução. O nome do arquivo é BADINS0000001065_0000000000 * sempre igual.

Você poderia me ajudar a conseguir isso?

    
por Mahesh Kothapalli 23.04.2015 / 16:50

3 respostas

1

Com awk , você pode fazer:

awk '
  /PATTERN/ { save = $0 ; next }
  { print }
  END { print save }
' infile > outfile

onde você tem que substituir PATTERN pelo padrão atual e infile é o seu arquivo de dados; renomeie apropriadamente.

O código funciona da seguinte maneira:

/PATTERN/ { save = $0 ; next } - se o padrão for encontrado, salve esta linha para uso posterior e pule a impressão (para que seja removido deste local)

{ print } - imprime as linhas no arquivo que não foram ignoradas pelo comando anterior

END { print save } - finalmente, quando todas as linhas são processadas, anexe a linha salva, aquela em que o padrão correspondeu


Se você quiser sobrescrever o arquivo original pelo novo arquivo, adicione um comando mv após o script awk :

mv outfile infile

novamente com nomes de arquivo apropriadamente escolhidos.

    
por 23.04.2015 / 16:54
1

Outra solução sed

sed -i '
        /9999999999/{h;d};           # move match string in hold space
        $G;                          # append string from hold space to end
        s/\n$//                      # avoid empty line if pattern have not met 
       ' BADINS0000001065_0000000000*
    
por 23.04.2015 / 17:03
0

A questão não está clara sobre se o 9999999999 está sempre presente ou se pode haver mais de uma instância no arquivo de entrada. Então, aqui está uma versão sed que atende a todas essas situações.
Consulte man sed (opção -i ) para atualização in-loco do arquivo de entrada.

sed -n '/9999999999/{H;b n}; p; :n; ${g;s/\n//p}' file
    
por 24.04.2015 / 00:29

Tags