|
From: | George Robinson |
Subject: | Re: [shell-script-pt] Ajuda para montar um json a partir de um CSV. |
Date: | Mon, 27 Dec 2021 15:15:55 -0300 |
George.Você já viu que nem adianta começar a pensar num algoritmo enquanto não temos uma ideia clara do conjunto de dados com que vamos interagir.Coloquei no PasteBin um exemplo de CSV, adicionando outra UF e já incluindo mais coisas que podem aparecer no meio dos dados, como linhas comentadas e linhas em branco com ou sem espaços e tabs.O PasteBin é prático para compartilhar exemplos e permite recuperar o conteúdo direto via linha de comando: curl -s https://pastebin.com/raw/fqQCyvLDO próprio site já adiciona outra variável na amostra de dados, que é o final de linha do CSV com CRLF: curl -s https://pastebin.com/raw/fqQCyvLD | cat -ANo Unix assumimos sempre que as linhas estão finalizadas apenas com LF mas, interagindo com sistemas alienígenas, podem muito bem estar finalizadas com CRLF.Então, veja a que ponto chegamos, como diria o motorista do ônibus :-pcsv2json()
{
local csv=$([[ -t 0 ]] && cat $1 || cat)
printf "["
sort -t, -k1,1 -k4,4n -k2,2n <<< "$csv" | while IFS=, read state_code term FICO_RANGE fico_range_min fico_range_max interest_rate
do
[[ ${state_code//@([ $'\t'$'\r']|#*)/} ]] || continue # pula linhas sem dados
[[ $fico_range_min != $prev ]] && novo || printf ","
printf "\n \"$term\": \"${interest_rate/$'\r'/}\""
prev=$fico_range_min
done
printf "\n }\n }\n\n]\n"
}
novo()
{
printf "
${prev:+ \}\n \},\n}
{
\"state_code\": \"$state_code\",
\"fico_range_min\": \"$fico_range_min\",
\"fico_range_max\": \"$fico_range_max\",
\"interest_rate\":
{"
}Até agora eu bati na tecla do ordenação pelo terceiro campo, mas como ele não passa de uma aglutinação do 4º com o 5º, abandonei ele e comecei a ordenar pelo 4º (fico_range_min). Se você vai ter outras UF's no CSV, como era bem de desconfiar, não basta ordenar pelo 4º campo. É preciso ordenar também pelo 1º (state_code). E, se os valores de fico_range_min não tiverem sempre a mesma quantidade de dígitos, temos que assumir esse campo como numérico na ordenação. Já aproveitei e ordenei numericamente o 2º campo (term), só pro dicionário interest_rate ficar "bonitinho" :-p É isso que o sort faz:curl -s https://pastebin.com/raw/fqQCyvLD | sort -t, -k1,1 -k4,4n -k2,2n | cat -AO cat -A está aí apenas para mostrar o CR (^M) no final da linha antes do LF ($) e as linhas aparentemente em branco mas contendo espaços e tabs.Veja que, usando os dados diretamente do PasteBin, o que temos é um stream de dados que, para poder ser usado pelo script (função, no caso), precisa ser interpretado como stream, não como arquivo. Claro, podemos mandar para um arquivo e então usar esse arquivo como parâmetro para o script. Mas o professor Julio Neves ensina no curso de Programação Shell Linux a fazer scripts que lêem dados de qualquer jeito: de um arquivo, via pipe, via <, << (heredocument) ou <<< (herestring). É basicamente ISSO que a linhacsv=$([[ -t 0 ]] && cat $1 || cat)faz: se o file descriptor 0 (stdin) está aberto, assume que os dados vieram de um arquivo cujo caminho foi especificado como parâmetro ($1). Se estiver fechado, vieram por redirecionamento (|, <, <<, <<<).Você pode ler mais sobre o teste -t (e todos os outros tipos) com o comando help test.Podemos ver o teste de stdin em ação de uma forma bem simples e direta:$ { [[ -t 0 ]] && echo stdin aberto || echo stdin fechado; }
stdin aberto
$ echo oi | { [[ -t 0 ]] && echo stdin aberto || echo stdin fechado; }
stdin fechadoEntão, não importa como vieram os dados, uma vez identificada sua origem e adequadamente lida, ela é passada para a variável $csv, que, por sua, vez será será passada por herestring para o sort.Com esse simples teste, o script pode receber dados de qualquer uma das seguintes formas:$ csv2json ./dados.csv$ cat ./dados.csv | csv2json$ curl -s https://pastebin.com/raw/fqQCyvLD | csv2json$ csv2json < ./dados.csv
$ csv2json << EOT
AL,12,800-819,800,819,0.0725
AL,12,820-850,820,850,0.0499
AK,12,700-719,700,719,0.1124
AK,12,720-739,720,739,0.1074
EOT
$ csv2json <<< "
AL,12,800-819,800,819,0.0725
AL,12,820-850,820,850,0.0499
AK,12,700-719,700,719,0.1124
AK,12,720-739,720,739,0.1074
"Há outros detalhes no script, mas esses são os mais diretamente relacionados às dúvidas que você apontou. Esse email já ficou grande o suficiente.Aliás, confira se o CSV do PasteBin REALMENTE é corretamente convertido em JSON. Olhando por cima parece que sim, mas...Em dom., 26 de dez. de 2021 às 14:36, George Robinson <george.robinson.br@gmail.com> escreveu:Olá Alfredo e Arkanon,Vocẽs foram espetaculares na ajuda de vocês. Eu testei ambos os casos, e me familiarizei com o primeiro script enviado pelo Alfredo, porém, como eu quero aprender mais sobre essa espetacular ferramenta que é o bash, eu fiquei com dúvidas, e confesso que me perdi no segundo script.Eu gostaria (se não for abusar da paciência de vocês com um leigo, duas informações).1 - No script do Alfredo, funcionou perfeitamente até o momento em que eu adicionei mais um stateCode a amostra de dados:agora, com AK e AL:state_code,term,fico_range,fico_range_min,fico_range_max,interest_rate
AK,12,700-719,700,719,0.1124
AK,12,720-739,720,739,0.1074
AK,12,740-759,740,759,0.1024
AK,12,760-779,760,779,0.0974
AK,12,780-799,780,799,0.0924
AK,12,800-819,800,819,0.0874
AK,12,820-850,820,850,0.0499
AK,24,700-719,700,719,0.1149
AK,24,720-739,720,739,0.1099
AK,24,740-759,740,759,0.1049
AK,24,760-779,760,779,0.0999
AK,24,780-799,780,799,0.0949
AK,24,800-819,800,819,0.0899
AK,24,820-850,820,850,0.0849
AK,36,700-719,700,719,0.1174
AK,36,720-739,720,739,0.1124
AK,36,740-759,740,759,0.1074
AK,36,760-779,760,779,0.1024
AK,36,780-799,780,799,0.0974
AK,36,800-819,800,819,0.0924
AK,36,820-850,820,850,0.0874
AK,48,700-719,700,719,0.1199
AK,48,720-739,720,739,0.1149
AK,48,740-759,740,759,0.1099
AK,48,760-779,760,779,0.1049
AK,48,780-799,780,799,0.0999
AK,48,800-819,800,819,0.0949
AK,48,820-850,820,850,0.0899
AK,60,720-739,720,739,0.1199
AK,60,740-759,740,759,0.1149
AK,60,760-779,760,779,0.1099
AK,60,780-799,780,799,0.1049
AK,60,800-819,800,819,0.0999
AK,60,820-850,820,850,0.0949
AL,12,690-699,690,699,0.0950
AL,12,700-719,700,719,0.0950
AL,12,720-739,720,739,0.0950
AL,12,740-759,740,759,0.0950
AL,12,760-779,760,779,0.0925
AL,12,780-799,780,799,0.0825
AL,12,800-819,800,819,0.0725
AL,12,820-850,820,850,0.0499
AL,24,690-699,690,699,0.1290
AL,24,700-719,700,719,0.1250
AL,24,740-759,740,759,0.1150
AL,24,760-779,760,779,0.1050
AL,24,780-799,780,799,0.0950
AL,24,800-819,800,819,0.0850
AL,24,820-850,820,850,0.0750
AL,36,690-699,690,699,0.0650
AL,36,700-719,700,719,0.1400
AL,36,720-739,720,739,0.1275
AL,36,740-759,740,759,0.1175
AL,36,760-779,760,779,0.1075
AL,36,780-799,780,799,0.0975
AL,36,800-819,800,819,0.0875
AL,36,820-850,820,850,0.0775
AL,48,690-699,690,699,0.0675
AL,48,700-719,700,719,0.1500
AL,48,720-739,720,739,0.1300
AL,48,740-759,740,759,0.1200
AL,48,760-779,760,779,0.1100
AL,48,780-799,780,799,0.1000
AL,48,800-819,800,819,0.0900
AL,48,820-850,820,850,0.0800
AL,60,690-699,690,699,0.0700
AL,60,700-719,700,719,0.1573
AL,60,720-739,720,739,0.1250
AL,60,740-759,740,759,0.1150
AL,60,760-779,760,779,0.1050
AL,60,780-799,780,799,0.9500
AL,60,800-819,800,819,0.8500
AL,60,820-850,820,850,0.0750--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------{
"stateCode": "AL",
"mincreditscore": "690",
"maxcreditscore": "699",
"interestrate": {
"12": "0.0950",
"24": "0.1290",
"36": "0.0650",
"48": "0.0675",
"60": "0.0700"
}
}
parse error: Expected separator between values at line 34, column 1PS: Consegui ignorar o erro inserindo o seguinte:...done < <(sort -n -k3 -t, input.csv) | sed -e 's/^{/'$(printf "\x1e")'{/' | jq '.'Ainda assim, precisei editar o json para que ele inserisse separadores entre as entradas:{
"stateCode": "AL",
"mincreditscore": "800",
"maxcreditscore": "819",
"interestrate": {
"12": "0.0725",
"24": "0.0850",
"36": "0.0875",
"48": "0.0900",
"60": "0.8500"
}
},
{
"stateCode": "AK",
"mincreditscore": "820",
"maxcreditscore": "850",
"interestrate": {
"12": "0.0499",
"24": "0.0849",
"36": "0.0874",
"48": "0.0899",
"60": "0.0949"
}
},
{
"stateCode": "AL",
"mincreditscore": "820",
"maxcreditscore": "850",
"interestrate": {
"12": "0.0499",
"24": "0.0750",
"36": "0.0775",
"48": "0.0800",
"60": "0.0750"
}
}Já no segundo script, eu confesso que eu boiei em grande parte dele, e explico:Por exemplo, meu nível "mortal' de bash, compreende a ideia de que um arquivo deve ser usado como entrada para que haja uma saída:Acredito que aqui "csv=$([[ -t 0 ]] && cat $1 || cat)" esteja sendo instruído o arquivo de entrada, mas realmente eu não entendi como ele sabe que dados.csv é a entrada (posso estar olhando errado tbm), pois temos aqui tbm a entrada:"sort -t, -k3,3 <<< "$csv""A segunda função (novo) foi mais até simples de compreender:novo()
{
printf "
${prev:+ \}\n \},\n}
{
\"state_code\": \"$state_code\",
\"fico_range_min\": \"$fico_range_min\",
\"fico_range_max\": \"$fico_range_max\",
\"interest_rate\":
{"
}mas aquele cat em /tmp/mkjson foi onde eu viajei legal (ok, pode ter sido gerado em qualquer lugar, mas eu não vi onde dados.csv foi tratado pela primeira função csv2json.Perdoem-me se estou num nível de compreensão muito abaixo pra conversar com vocês, mas agora que sei que dá pra fazer, eu só não entendi como é que funciona. Se não for abusar demais, poderiam me elucidar?Está pronto, funciona, mas eu ainda não consegui compreender o que foi feito (no caso, no script do Arkanon)Muito obrigado desde já por terem elucidado pra mimEm dom., 26 de dez. de 2021 às 10:05, Arkanon <arkanon@lsd.org.br> escreveu:Exatamente minha sugestão original, Alfredo :)TODO o segredo se resume em ordenar pelo 3º campo:csv2json()
{
local csv prev campos='state_code term FICO_RANGE fico_range_min fico_range_max interest_rate'
local $campos
csv=$([[ -t 0 ]] && cat $1 || cat)
printf "["
sort -t, -k3,3 <<< "$csv" | while IFS=, read $campos
do
[[ $state_code ]] || continue # pula linhas em branco
[[ $fico_range_min != $prev ]] && novo || printf ","
printf "\n \"$term\": \"$interest_rate\""
prev=$fico_range_min
done
printf "\n }\n }\n\n]\n"
}
novo()
{
printf "
${prev:+ \}\n \},\n}
{
\"state_code\": \"$state_code\",
\"fico_range_min\": \"$fico_range_min\",
\"fico_range_max\": \"$fico_range_max\",
\"interest_rate\":
{"
}$ cat tmp/mkjson/dados.csv
AK,12,700-719,700,719,0.1124
AK,12,720-739,720,739,0.1074
AK,12,740-759,740,759,0.1024
AK,12,760-779,760,779,0.0974
AK,12,780-799,780,799,0.0924
AK,12,800-819,800,819,0.0874
AK,12,820-850,820,850,0.0499
AK,36,700-719,700,719,0.1174
AK,36,720-739,720,739,0.1124
AK,36,740-759,740,759,0.1074
AK,36,760-779,760,779,0.1024
AK,36,780-799,780,799,0.0974
AK,36,800-819,800,819,0.0924
AK,36,820-850,820,850,0.0874...$ csv2json < dados.csv[
{
"state_code": "AK",
"fico_range_min": "700",
"fico_range_max": "719",
"interest_rate":
{
"12": "0.1124",
"24": "0.1149",
"36": "0.1174",
"48": "0.1199"
}
},...{
"state_code": "AK",
"fico_range_min": "820",
"fico_range_max": "850",
"interest_rate":
{
"12": "0.0499",
"24": "0.0849",
"36": "0.0874",
"48": "0.0899",
"60": "0.0949"
}
}
]Em sáb., 25 de dez. de 2021 às 14:45, Alfredo Casanova <atcasanova@gmail.com> escreveu:primeiro acho melhor tratar o input reordenado:
sort -n -k3 -t, input.csvvai organizar o arquivo por creditscorecomo a primeira taxa é sempre pra 12 prestações, podemos fazer:#!/bin/bash
while IFS=, read state installments faixa mincred maxcred interest; do
# se for a primeira linha, preencha o novo bloco
(( installments == 12 )) && {
echo "{
\"stateCode\":\"$state\",
\"mincreditscore\":\"$mincred\",
\"maxcreditscore\":\"$maxcred\",
\"interestrate\": {
\"12\": \"$interest\","
} || {
maior=$(grep "$faixa" input.csv | cut -f2 -d, | sort -n | tail -1)# se for a maior quantidade de parcelas, feche o bloco
(( maior == installments )) && {
echo "\"$installments\":\"$interest\"
}
}"
} || {# se não, adicione a nova parcela
echo "\"$installments\":\"$interest\","
}
}
done < <(sort -n -k3 -t, input.csv) | jq '.'On Fri, Dec 24, 2021 at 10:13 AM Alfredo Casanova <atcasanova@gmail.com> wrote:On Fri, Dec 24, 2021 at 12:14 AM Arkanon <arkanon@lsd.org.br> wrote:Aliás, você está quase lá SE ordenou o csv adequadamente, claro :) Senão não nem adianta começar o loop.Em sex., 24 de dez. de 2021 às 00:11, Arkanon <arkanon@lsd.org.br> escreveu:Você está quase lá :)Seu if deve testar se o valor de mincreditscore mudou. SE mudou, é porque começou um novo grupo de dados e NESSE CASO, deve ser escrita a sequencia de stateCode, mincreditscore e maxcreditscore. Caso contrario, ainda estará no mesmo grupo e portanto escreverá apenas os interestrate desse grupo. Mais as aspas, chaves, colchetes e vírgulas e "problem solved" :)Em sex., 24 de dez. de 2021 às 00:00, George Robinson <george.robinson.br@gmail.com> escreveu:Olá Arkanon!Eu tbm preparei um loop num segundo script, mas me parece mais uma questão de entender arranjo e combinaçao. O meu loop falha pq eu caio na mesma questão de não conseguir rodar o loop com um if. Acredito que o ponto chave seja o fato de que o jq não é a melhor ferramenta para isso, visto que ao usá-lo, ele me parece ser muito direcionado a um parsing no arquivo, sem considerar as condiçoes envolvidas. Deixe-me mostrar até onde cheguei com o loop:file=amostra.csvwhile IFS=, read state_code,term,fico_range,fico_range_min,fico_range_max,interest_rate;
do
if [[ $state_code == AK && "$term" == "12" ]]; thenecho "{"
echo '"stateCode": "$state_code"'
echo '"State Min FICO": "$state_min_fico"'
echo '"FICO Range Min": "$fico_range_min"'
echo '"FICO Range Max": "$fico_range_max"'
echo '"Interest Rate": {'echo "}"echo "}"
fi;
done < $fileEm qui., 23 de dez. de 2021 às 23:21, Arkanon <arkanon@lsd.org.br> escreveu:Vamos começar determinando a melhor forma de ler os dados.Com base na amostra, parece que o critério de agrupamento é mincreditscore. Possivelmente também stateCode, mas sua amostra não esclarece 100% esse ponto.Então, se você ordenar o csv por esse(s) campo(s) vai deixá-los numa sequência adequada para serem lidos por um loop onde, sempre que o campo mincreditscore mudar, iniciará um novo dicionário com atributos stateCode, mincreditscore e maxcreditscore seguidos de um array de interestrate. aparentemente o terceiro campo do csv pode ser descartado.O loop é apenas o método mais tradicional e óbvio de implementar o algoritmo, mas é bem possível que exista uma ferramenta que já faça essa tradução automaticamente. Não conheço jq suficientemente para afirmar se ele é ou não uma ferramenta adequada para essa conversão, tenho a impressão que não. Talvez uma ferramenta diretamente focada em csv.Eu começaria correndo o risco de reinventar a roda e implementando o loop.At.Em qui., 23 de dez. de 2021 às 22:24, George Robinson <george.robinson.br@gmail.com> escreveu:_______________________________________________Pessoal,Estou tentando um desafio particular para criar uma estrutura de dados em json a partir de um arquivo CSV. Eu solucionei parte do problema, e vou apresentá-lo abaixo:1- Tenho um arquivo .csv com a seguinte estrutura de dados:state_code,term,fico_range,fico_range_min,fico_range_max,interest_rateAK,12,700-719,700,719,0.1124AK,12,720-739,720,739,0.1074
AK,12,740-759,740,759,0.1024
AK,12,760-779,760,779,0.0974
AK,12,780-799,780,799,0.0924
AK,12,800-819,800,819,0.0874
AK,12,820-850,820,850,0.0499AK,24,700-719,700,719,0.1149AK,24,720-739,720,739,0.1099
AK,24,740-759,740,759,0.1049
AK,24,760-779,760,779,0.0999
AK,24,780-799,780,799,0.0949
AK,24,800-819,800,819,0.0899
AK,24,820-850,820,850,0.0849AK,36,700-719,700,719,0.1174AK,36,720-739,720,739,0.1124
AK,36,740-759,740,759,0.1074
AK,36,760-779,760,779,0.1024
AK,36,780-799,780,799,0.0974
AK,36,800-819,800,819,0.0924
AK,36,820-850,820,850,0.0874AK,48,700-719,700,719,0.1199AK,48,720-739,720,739,0.1149
AK,48,740-759,740,759,0.1099
AK,48,760-779,760,779,0.1049
AK,48,780-799,780,799,0.0999
AK,48,800-819,800,819,0.0949
AK,48,820-850,820,850,0.0899AK,60,720-739,720,739,0.1199AK,60,740-759,740,759,0.1149
AK,60,760-779,760,779,0.1099
AK,60,780-799,780,799,0.1049
AK,60,800-819,800,819,0.0999
AK,60,820-850,820,850,0.0949Obs: coloquei a coloração para que fique claro que para cada item no campo term, temos praticamente os mesmos campos Range_min e Fico_Range_max, com seu respectivo interest_rate. Notem que essa configuração toda, refere-se ao mesmo state_code (AK). Então, basicamente, temos uma estrutura de dados que deveria sair assim:{"stateCode" : "AK",
"mincreditscore" : "700",
"maxcreditscore" : "719",
"interestrate" : {
"12" : "0.1024",
"24" : "0.1149",
"36" : "0.1174""48" : "0.1199"}}{"stateCode" : "AK",
"mincreditscore" : "720",
"maxcreditscore" : "739",
"interestrate" : {
"12" : "0.1074",
"24" : "0.1099",
"36" : "0.1124""48" : "0.1149""60" : "0.1199"}}{"stateCode" : "AK",
"mincreditscore" : "740",
"maxcreditscore" : "759",
"interestrate" : {
"12" : "0.1024",
"24" : "0.1049",
"36" : "0.1074""48" : "0.1099""60" : "0.1149"}}e assim por diante...Bom, sobre como vou montar esse json, eu poderia fazer com um echo ou printf, porém, decidi ler diretamente o arquivo utilizando a ferramenta jq.tail -n +2 jqlookup.csv | jq -Rsn '
{"occurrences":
[inputs
| . / "\n"
| (.[] | select(length > 0) | . / ",") as $input
| {"product": "5a014b7094a4a92ba5fba4e1", "stateCode": $input[0], "mincreditscore": $input[3], "maxcreditscore": $input[4], "interestrate": {"12": $input[5], "24": $input[5], "36": $input[5]}}]}'O que obviamente não deu certo, pois ele monta a estrutura linha a linha, conforme solicitado no comando acima.O que eu preciso é que dentro da estrutura, seja possível capturar as propriedades do campo interestrate de acordo com o term, ou seja, para cada fico_range, eu possa agrupar os valores de term (12,24,36,48 ou 60) juntoc om o fico_range e colocar o valor de interest_rate. para produzir aquela saída que exemplifiquei.Não precisa ser com jq... pode ser com printf, echo... desde que seja produzida a estrutura acima.Muito obrigado desde já!--George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
--_______________________________________________(o_ @arkanon (Twitter) __o
//\ arkanon@lsd.org.br _`\<,
V_/_ www.lsd.org.br (_)/(_)
---------------------------------
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
--_______________________________________________George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
--(o_ @arkanon (Twitter) __o
//\ arkanon@lsd.org.br _`\<,
V_/_ www.lsd.org.br (_)/(_)
---------------------------------
--_______________________________________________(o_ @arkanon (Twitter) __o
//\ arkanon@lsd.org.br _`\<,
V_/_ www.lsd.org.br (_)/(_)
---------------------------------
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
--[]'s
Alfredo Tristão Casanova
Linux User #228230--_______________________________________________[]'s
Alfredo Tristão Casanova
Linux User #228230
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
--_______________________________________________(o_ @arkanon (Twitter) __o
//\ arkanon@lsd.org.br _`\<,
V_/_ www.lsd.org.br (_)/(_)
---------------------------------
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
--_______________________________________________George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
--_______________________________________________(o_ @arkanon (Twitter) __o
//\ arkanon@lsd.org.br _`\<,
V_/_ www.lsd.org.br (_)/(_)
---------------------------------
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
[Prev in Thread] | Current Thread | [Next in Thread] |