Para passar um parâmetro com sed

1

Para o meu script eu tenho que ler os dados de um arquivo.

Por exemplo, eu tenho 2 arquivos: um é um arquivo de texto, o segundo é um arquivo csv com 10 colunas.

O que estou tentando fazer é ler o csv e alterar os parâmetros no primeiro arquivo.

  1. Usando sed -n para ler os dados uma linha por vez e salve isso em fileC
  2. Usando sed "s/&replacefile1param/&readFileC/g"

O que eu tenho problema é ler o cat de readFileC como um parâmetro na segunda etapa. Como posso fazer isso?

O primeiro arquivo é um arquivo de script de amostra com 2 parâmetros dentro. O segundo arquivo é um arquivo CSV com 200 linhas com 6 colunas.

Eu preciso alterar o arquivo de modelo lendo as colunas do CSV e substituindo os parâmetros. O resultado precisa ser 200 file1 e cada resultado precisa ser salvo no local especificado na quarta coluna do CSV também.

Arquivo de modelo de amostra

The name =scriptname

The staments go here

job name = jobname

exit

Dados CSV de amostra

scriptname,jobname,date,location,updated,env
kkkkkk,filetest,2001-01-01,/san00/project,test
kkkkk2,filetest2,2001-01-01,/san00/project,test
kkkkk3,filetest3,2001-01-01,/san00/project2,real

Eu preciso substituir os parâmetros no arquivo de modelo pelos valores obtidos do CSV e salvar o arquivo na localização /san00 da quarta coluna do CSV.

Saída desejada

The script name kkkkkk

The staments go here

job name = filetest

exit

Isso deve ser salvo em san00/project .

    
por math 03.03.2012 / 16:25

2 respostas

1

file1 é o modelo e file2 o csv. O que acontece se duas linhas tiverem a mesma localização, for indefinida, a solução abaixo sobrescreve o arquivo de localização com os dados mais recentes. Também não está claro para mim se o diretório /san00 é o único usado na parte de localização e se é suposto ser um caminho absoluto.

Solução de criação de locais em relação ao diretório atual (observe o . em .$dir e .$location ).

while IFS=, read scriptname jobname date location updated env; do
    dir=$(dirname $location)
    [ -d .$dir ] || mkdir -p ".$dir"
    sed -e "s/scriptname/$scriptname/" \
        -e "s/jobname/$jobname/" file1 > ".$location"
done < <(tail -n +2 file2)

Solução com caminhos absolutos na localização, os diretórios de destino devem pré-existir

while IFS=, read scriptname jobname date location updated env; do
    sed -e "s/scriptname/$scriptname/" \
        -e "s/jobname/$jobname/" file1 > "$location"
done < <(tail -n +2 file2)

Existem muitas maneiras de extrair as informações de file2 , o acima é apenas uma delas e, dependendo da natureza dos dados, pode ser mais complicado do que isso.

    
por 03.03.2012 / 22:10
0

Isso pode funcionar para você:

sed '1d;s|\([^,]*\),\([^,]*\),[^,]*,\([^,]*\).*|sed "1s/scriptname//;5s/jobname//" template >|' file.csv |
sh
    
por 08.03.2012 / 14:18