+ Responder ao Tópico



  1. #1

    Padrão Shell script (transformar linha a linha em unica linha)

    Pessoal,

    Tenho um arquivo que está assim:

    dado1
    dado2
    dado3
    dado4
    dadon
    Preciso que com algum comando eu faça com essas linhas fiquem todas em uma unica linha deixando um espaço entre eles:

    dado1 dado2 dado3 dado4 dadon
    Já tentei o gawk, cat, sed e não consegui achar nada que faça isso. Como devo proceder?

    Att,

    Nataniel Klug

  2. #2

    Padrão Shell script (transformar linha a linha em unica linha)

    Povo,

    Consegui resolver. Achei que precisava de tudo em uma linha e notei que o cat executando dentro de outro programa faria isso automaticamente.

    O que eu precisava era remover alguns pacotes que estavam em uma lista, fiz o comando assim:

    Código :
    #rpm -e `cat pacotes-remover`

    Resolvido...

    Att,

    Nataniel Klug

  3. #3
    Avenger
    Visitante

    Padrão Shell script (transformar linha a linha em unica linha)

    Prá comemorar a TERCEIRA VEZ que uso esse algoritmozinho hoje só aqui no forum prá responder dúvidas, vou colocar aqui o codigozinho que fiz juto para isso hoje, para responder a dúvida de um companheiro de dúvidas.

    Código :
    #!/bin/bash
    user=ana
    domain=dominio.com.br
    matches="$(cat /home/vpopmail/domains/${domain}/vpasswd | grep "${user}")"
    for ((counter=1;$counter "<=" $(echo "$matches" | wc -l);counter=$(($counter+1)))); do
     match="$(echo "${matches}" | head -n $counter | tail -n 1)"
     if [ "$(echo "$match" | cut -f1 -d":")" == "${user}" ]; then 
      echo "${match}" | cut -f6 -d":"
      break
     fi
    done

    Esse é o código original que fiz pro moço. Agora vou modificá-lo afim de que ele leia um dado arquivo e faça justo o que vc quer; que troque os 'enters' por 'espaços':

    Código :
    #!/bin/bash
    if [ -z "${1}" ]; then
     file=~/lista.txt
    else
     file="${1}"
    fi
     
    final_result=
    contents="$(cat $file)"
    num_lines="$(echo "${matches}" | wc -l)"
    for ((counter=1;$counter "<=" $num_lines;counter=$(($counter+1)))); do
     currline="$(echo "${contents}" | head -n $counter | tail -n 1)"
     final_result="${final_result}${currline} "
    done
    echo "${final_result}"

    Alguma coisinha ou outra pode ser melhorada: mas esse aí faz o truque que você queria.
    É útil usar dessa forma quando se precisar estudar linha por linha, ou tratar, pegar algum 'pedaço' da linha, como no exemplo original, eu comparo se a linha contém entre ':', a sequencia de letras da variável 'user', caso positivo ele toma um procedimento e interrompe a fiscalização das outras linhas restantes.
    A outra vez que fiz isso foi para ajudar um cara a tentar fazer uma atualização entre dois MTA's mantendo um servidor de e-mail antigo funcionando enquanto o outro entrar: um pedaço desse script ajudou, a partir de uma lista com o nome dos usuários da máquina antiga, a criar o usuário e setar com redirecionamento para a MTA antiga. O pequeno pode fazer coisas graandes! :P

  4. #4

    Padrão Shell script (transformar linha a linha em unica linha)

    Avenger,

    Muito obrigado. Consegui resolver antes, mas vou guardar seu código para que eu tenha ele no futuro quando eu precisar.

    Att,

    Nataniel Klug

  5. #5
    Avenger
    Visitante

    Padrão Shell script (transformar linha a linha em unica linha)

    eh, hehe eu vi que você tinha resolvido, mas eu não podia perder a oportunidade de colocar pela terceira vez o codiguim... no mesmo dia o mesmo scriptzinho responder 3 perguntas valeu 'forçar a barra' um pouco prá enfiar ele aqui no seu tópico hehe