Substituir o padrão no arquivo pelo padrão de uma lista, recursivo, por linha

0

Estou tentando o seguinte:

/dir1/textfile
/dir2/textfile
/dir3/textfile

"textfile" tem sempre o mesmo conteúdo, um número simples (400).

Agora, tenho um arquivo de dados com números diferentes e cada valor está em uma nova linha (portanto, um número por linha)

O que eu gostaria de fazer é substituir o valor em "textfile" (400) pelos valores no arquivo de dados, mas os números devem corresponder às entradas no meu arquivo de dados, portanto:

datafile
14
25
335

14 deve ser escrito em dir1/textfile

25 deve ser escrito em dir2/textfile

335 deve ser escrito em dir3/textfile

e assim por diante ...

Brinquei com sed , mas até agora não encontrei nenhuma solução de trabalho. Alguma idéia?

    
por Dieter 31.01.2017 / 15:22

1 resposta

1

com awk :

awk '{print $0 > "dir"NR"/textfile"}' datafile
  • NR se expande para o número do registro atual, portanto, cada linha será salva em dir<line_number>/textfile , por exemplo, a primeira linha seria salva em dir1/textfile , a segunda seria em dir2/textfile e assim por diante.

Não há necessidade do dispendioso while de loop pelas linhas do arquivo e da operação:

i=1; while IFS= read -r line; do echo "$line" >dir"$i"/textfile; ((i++)); done <datafile

A forma de shell acima é apenas para mostrar o método, você deve seguir a awk way.

Edite com base no comentário:

Para substituir todos os 400 s pelos números necessários de datafile :

i=1; while IFS= read -r line; do sed "s/400/$line/g" dir"$i"/textfile; ((i++)); done <datafile

Para editar os arquivos no local:

i=1; while IFS= read -r line; do sed -i "s/400/$line/g" dir"$i"/textfile; ((i++)); done <datafile

Arquivos originais cujo backup foi feito com .bak extension:

i=1; while IFS= read -r line; do sed -i.bak "s/400/$line/g" dir"$i"/textfile; ((i++)); done <datafile
    
por 31.01.2017 / 15:44

Tags