--- Em [email protected], "Ernander (Nander)" <ernan...@...> escreveu > > Bom dia A Todos! > > Primeiramente gostaria de pedir Desculpas pela gafe do e-mail em html. E > para me redimir todos os exemplos que darei são impreterivelmente no > pastebin. Segundo que eu estive fora e não pude responder em tempo as > atenções ao meu problema. > > Voltando ao assunto, estou comendo ER's para tentar enten der e fazer tudo > para obter um melhor resultado. A Solução do Cristiano Ferrari, como sempre > um grande colaborador da Lista, ajudou muito mas com o "head -n 2" estava > pegando uma linha a mais, o que foi consertado com um "head -n 1" ( basico > he he ) . > > Ate agora Bakana! O problema Agora é : > > como recebo um arquivo com as movimentações mensais desta forma: > > ver 1º Exemplo do pastebin > > preciso pegar o nome do Cliente (2º Campo), data da postagem (6º campo), > numero da encomenda (7º campo) e jogar junto com o retono da verificação > junto ao site dos correios a Data(1º campo de retorno), hora(segundo campo > de retorno) e o Status da encomenda( último campo de retorno) ( vide 2º > exemplo pastebin). > > Nisso montando a Seguinte saída: > > Vide 3 exemplo pastebin > > Bom ate então, com a ajuda de vocês a tarefa parecia simples mas quando me > deparei que tem cidade com um nome maior que do de DOM PEDRO PRIMEIRO, e que > não conseguia buscar com um padrão o Status e nem o nome do Cliente pois o > numero de espaços é enorme e quase não é mensurável. > > Como fazer para pegar a String com espaços tanto no nome do Cliente ( > Arquivo de entrada) e do so Status na pesquisa do site ( sabendo que tem > Cidades com nomes muito grandes) > > o meu simplório script segue: > > Vide exemplo 4 do pastebin: > > Se eu jogo o resultado da busca no site em uma variável RESULTADO da > busca no site e tento pegar somente o que me interessa assim: > > echo $RESULTADO | awk '{ print $1 ";" $2 ";" $4 }' > > Não Consigo pegar Somente o Status pois tenho Status Diversos como entregue > e Aguardando retirada. O mesmo ocorre qdo tento pegar o nome do Cliente que > tem espaços. ja no caso do Cliente eu poderia remover os Espaços do Arquivo > e trocar por UNDERLINE mas como proceder no retorno do Site? > > Julio, como estou comendo o Seu LIVRINHO ( HE HE HE ), Aliás muito bom e > estou engatinhando nas ER's poderia me explicar a Sua onlinER ? pois não > funcionou aqui comigo. Quando vc se refere a arquivo na ER: > > > grep -A2 '[0-3][0-9]/[0-1][0-9]/20[0-1] [0-9] [0-2][0-9]:[0-5][0-9]' arquivo > | tail -2 | tr -d '\n' > > Não entendi pois o retono é via pesquisa do Lynx e tambem havia substituido > pela ER do Cristiano e não deu certo. > > > valeu mesmo a ajuda e contem comigo no que eu puder ajudar!
Ilustre Ernander. Se você tem o livro do Júlio, dá uma procurada nele sobre a variável $IFS (internal field separator). É por ela que você começa a solução do seu problema. Primeiro, você não precisa passar a linha inteira no while e depois ficar cortando ela para achar os seus campos. Teu arquivo de origem é um CSV (delimitado por ";"), você já tem os campos separados. Basta informá-los ao while com uma sintaxe parecida com isto: while read VAR1 VAR2 ... VARn ; do comando1 comando2 done < /tmp/arquivo_origem.txt Para cada campo no seu arquivo de origem, informe o nome de uma variável após o read (CAMPO1=VAR1, CAMPO2=VAR2, etc.). Daí, é só pegar o campo certo e fazer o que precisa com ele dentro do laço. Porém, para que isso aconteça, é necessário que o shell reconheça que os ";" do seu arquivo original são os separadores de campos. Por padrão, o IFS do bash é o caracter espaço. Para mudar isso, basta, antes do laço (while), mudar o IFS; atribuindo outro valor para a variável $IFS. Porém, antes de mudar o valor, lembre-se de guardar o original em outra variável, e voltar a ele logo após o fim do laço (done). Senão, "coisas estranhas" podem acontecer. Outro detalhe. Para concatenar o BR no número do track, você não precisa fazer isso: ENCOMENDA=`echo $CODIGO`BR Basta um ENCOMENDA="$CODIGO"BR. Assim, você evita chamar mais um processo desnecessário (o echo) e concatena o "BR" no momento que o bash faz a expansão das variáveis. (isso também tá no livro do tio Júlio). Aliás, no seu caso, você nem precisa se dar o trabalho de fazer isso, basta acrescentar o BR como parte da URL que passa ao lynx. Economiza mais uma etapa no script. Já o problema do tamanho do nome da cidade você resolve fácil. Lembra da dica do Júlio, de trocar o meu sed pelo tr? Adapta ela. Usa o tr, mas ao invés de fazer com parametro -d, para excluir a ocorrência da quebra de linha, troca por um caracter qualquer, que te servirá de marcador para um cut. Por exemplo o #. Assim, você faz um cut para pegar a data, outro para a hora (usando o espaço como delimitador) e um outro cut para pegar o staus (usando o # como delimtador). Pode também trocar os dois primeiros cuts por um um while, usando a mesma lógica que te expliquei no início. Então, dentro do laço, você joga o resultado da pesquisa vinda do lynx em uma variável, depois corta ela e atribui a data em uma variável, a hora em outra, e o status em outra. Como você já tem os valores do arquivo original é só fazer um echo com todas variáveis (as que vieram do links e as do arquivo original), intercalados com os ";", e terá a saída redondinha. Geralmente não gosto de postar o script pronto, pois acho que te tira a possibilidade de aprender. Então, tenta escrever ele aí que mais tarde e posto o meu para você comparar. Até mesmo porque, agora o site dos correios está um coco de lento e não vou postar o script sem testá-lo. Abraço Cristiano Abraço
