Copie as duas primeiras linhas de um arquivo e remova as linhas

1

Eu preciso processar um arquivo usando um script de shell. O arquivo chega com os dados, bem como algumas informações incorporadas, que são relevantes para o processamento. O arquivo está no seguinte formato:

  • email_address
  • system_area
  • item_number
  • item_number
  • item_number
  • item_number
  • e assim por diante ...

O email_address é necessário para notificar o usuário que envia o arquivo que foi concluído e o system_area indica para o processo de carregamento onde o arquivo deve ser carregado. Portanto, estou usando esses dois valores em variáveis para uso no script. Atualmente, estou usando 3 comandos sed para obter as informações e, em seguida, remover as linhas;

var1=$(sed -n '1p' infile)
var2=$(sed -n '2p' infile)
sed -i '1,2d' infile

O código acima funciona, mas eu sinto que é "desajeitado" e provavelmente ineficiente. Alguém sabe de uma maneira de alcançar os mesmos fins com mais elegância / eficiência?

    
por BriteSponge 29.01.2015 / 13:05

2 respostas

2

Seu código está bem, eu provavelmente faria isso como uma solução rápida. É mais eficiente sair do sed imediatamente após a impressão: sed -n '1{p;q}' para evitar a leitura do arquivo inteiro sem motivo.

Agora, a parte mais difícil é ler o arquivo duas vezes para obter as duas primeiras linhas. Você poderia simplesmente usar builtins de shell:

{ read -r var1; read -r var2; } < infile

e, em seguida, mantenha sed -i '1,2d' ou simplesmente use tail -n +3 > outfile; mv outfile infile .

A melhor maneira de fazer isso em uma única passagem é ler as duas variáveis com read e, em seguida, cat the rest:

{ read -r var1; read -r var2; cat; } < infile > outfile

Note que estou salvando a saída em outro arquivo (e então você pode copiá-lo de volta). Isso não é tão "elegante" quanto a modificação inplace com sed , mas é mais seguro, e faz a mesma quantidade de escrita. Esta última versão também só lê o arquivo uma vez, não três vezes.

    
por 29.01.2015 / 13:33
0

Parece-me que var1 e var2 terão o mesmo valor.

eu usaria

 var1=$(awk 'NR==1' infile)
 var2=$(awk 'NR==2' infile)
 sed -i '1,2d' infile

onde

  • NR é uma variável awk que significa Número de registro, que é o número da linha.
  • NR==1 selecione a linha 1
  • a ação padrão do awk é imprimir a linha inteira
por 29.01.2015 / 13:12