Estou tentando criar um loop while para que pegue o conteúdo de um arquivo e crie algum conteúdo em outro arquivo. Mas o que notei é que ele está apenas criando a última linha do arquivo em vez de todas as linhas do arquivo. O que estou perdendo aqui? Ou minha abordagem com echo está errada?
Meu arquivo chamado "teste" contém uma lista de strings para ex.
unix_idx
web_pn_iis
wis_healthpartners
Estou usando o seguinte comando para tentar criar um loop while.
while read -r line;
do
echo " {
\"name\": \"$line\",
\"datatype\": \"event\",
\"searchableDays\": 180,
\"maxDataSizeMB\": 0,
\"totalEventCount\": \"0\",
\"totalRawSizeMB\": \"0\"
}," > myfile.json;
done < test;
mas uma vez que o comando é executado, myfile.json contém apenas a última linha lida do arquivo de teste. ou seja, wis_healthpartners
{
"name": "wis_healthpartners",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
},
Então eu acho que o eco está sobrescrevendo as linhas enquanto o loop while é executado e fica apenas com a última linha. Como faço para ajustar isso para que ele contenha todas as linhas juntas? Minha saída desejada é como abaixo.
{
"name": "unix_idx",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
},
{
"name": "web_pn_iis",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
},
{
"name": "wis_healthpartners",
"datatype": "event",
"searchableDays": 180,
"maxDataSizeMB": 0,
"totalEventCount": "0",
"totalRawSizeMB": "0"
},
No Bash, o
>
operador substitui intencionalmente todos os dados existentes no arquivo, enquanto o>>
operador anexa.Se você precisar ter certeza de que o arquivo está vazio antes de começar, você pode usar
printf "" > myfile.json
para limpá-lo antes que seu loop seja executado, então use>>
para continuar gravando até o final.Se as entradas no arquivo de teste foram strings JSON corretamente citadas
então você pode usar
jq
's--slurpfile
para puxá-los para uma matriz e, em seguida, iterar sobre isso para criar uma matriz de objetos de um arquivo JSON de modelo:ex.
Se você precisar trabalhar com elementos sem aspas, poderá fazer o mesmo
--rawfile
, embora seja um pouco mais trabalhoso:A fatia
[0:-1]
é necessária porquesplit("\n")
interpreta atest
nova linha à direita do arquivo como indicativa de um elemento vazio adicional.