shell script para anexar texto em arquivos csv com base em restrições

1

No meu projeto, tenho muitos arquivos chamados “config.csv”. Minha exigência é adicionar uma configuração no final do arquivo com base em certas restrições.

- Get All config.csv files across the project.
- The config.csv should have 7 columns.
- Add if the property does not exist then add one at the end of the file.
- Sometimes there might be a new line character at the end. sometimes there might not be.

A propriedade é assim.

1/1/1970,,propertyName,"Description of the Config","false",,1

Como posso escrever um script para realizar essa tarefa?

Aviso: Sou novo em scripts e quero automatizar o processo dessa tarefa o máximo que puder.

    
por Furqan Shaikh 30.11.2015 / 16:59

1 resposta

1

Crie os seguintes arquivos:

add_conf.awk :

BEGIN {FS=","}
NF!=7 {bad=1; exit 1}
      {print}
END   {if (!bad) print "1/1/1970,,propertyName,\"Description of the Config\",\"false\",,1"}

add_conf.sh :

#!/bin/sh
tempfile=$(mktemp)

for f
do
        if awk -f add_conf.awk "$f" > "$tempfile"
        then
                cp "$tempfile" "$f"
        fi
done

rm "$tempfile"

e faça chmod +x add_conf.sh . (Claro que você pode colocar esses arquivos em algum lugar diferente do diretório atual; apenas ajuste as referências do nome do arquivo de acordo.) Então faça

find . -name config.csv -type f -exec ./add_conf.sh {} +

O comando find encontrará todos os arquivos simples chamados config.csv e passar seus nomes (caminho) para add_conf.sh . Esse script invoca awk em cada um dos arquivos, escrevendo a saída para um arquivo temporário. Se o processo awk informar sucesso, o script copia a saída de volta sobre o arquivo de entrada.

O script awk , add_conf.awk , define o separador de campo (FS) como vírgula (o que é óbvio quando se lida com um arquivo separado por vírgula). Se encontrar qualquer linha que tenha outros campos que não sejam sete (separados por vírgula), ele define o sinalizador bad e sai com um status de 1, de modo que o script de shell verá que esse arquivo é não qualificado e vai deixar isso em paz. Caso contrário, imprime cada linha de entrada no arquivo de saída (temporário). Ele adicionará uma nova linha à última linha, se necessário. Então, se o arquivo estiver OK até o final, adicione a nova linha de dados.

Notas:

  • O texto acima foi escrito para o% GNUawk. POSIX awk não especifica o comportamento dos dados de entrada que não terminam com nova linha, e não suporta o comando exit .
  • Eu ignorei sua terceira bala, " se a propriedade não existir adicione um ao final do arquivo". Provavelmente pode ser adicionado facilmente se você esclarecer o que quer dizer.
por 01.12.2015 / 00:34