Bash: Convertir una columna de texto en un fila

15
6569

Supongamos que tenemos un archivo de texto llamado distros.txt con lo siguiente:

archlinux
debian
ubuntu
kaos
fedora
slackware
gentoo


Y deseamos convertirlo en:

archlinux debian ubuntu kaos fedora slackware gentoo

Para lograr esto usaremos un ciclo for y un echo -n :

for i in `< distros.txt`; do echo -n ${i}" ";done; echo ""

Listo, esto hace el truco 🙂

Esto nos mostrará en la terminal el resultado deseado, si por otra parte queremos ya que se guarde en otro archivo .txt redireccionamos el output:

for i in `< distros.txt`; do echo -n ${i}" ";done; echo "" > distros-nuevas.txt

Y listo 🙂

Bueno nada, espero les sea de utilidad. Válido aclarar que también se puede hacer con expresiones regulares, solo que no sé cómo… pero, con expresiones regulares se puede hacer casi todo jajaja.

15 COMENTARIOS

  1. Si en un .odt tengo en cada página 2 columnas, se leen así:

    pág.1
    col.1 col.2
    pág.2
    col.3 col.4
    etc.

    ¿cómo hago para que quede cada columna debajo de la otra?
    col.1
    col.2
    col.3
    col.4
    etc.

  2. Mucho más fácil:

    Si lo deseas separado por tabulaciones:
    Escribes: paste -s distros.txt
    Obtienes: archlinux debian ubuntu kaos fedora slackware gentoo

    Si lo deseas separado por espacios:
    Escribes: paste -s -d” ” distros.txt
    Obtienes: archlinux debian ubuntu kaos fedora slackware gentoo

    Si lo deseas separado por comas:
    Escribes: paste -s -d, distros.txt
    Obtienes: archlinux,debian,ubuntu,kaos,fedora,slackware,gentoo

    Con paste, cat, awk y demás amigos, con un poco de ingenio se pueden hacer muchas combinaciones útiles sin complicarse la vida.

    Que siga todo genial, enhorabuena por el premio en Portalprogramas!

    • Fácil también, esta vez con awk.
      Suponiendo que estén separados los campos por tabulaciones o espacios, que es lo más corriente ( si es por comas u otra cosa hay que tenerlo en cuenta e indicarlo), y que el archivo ahora contiene: archlinux debian ubuntu kaos fedora slackware gentoo

      Ya que awk nos dá directamente el campo que deseemos, hay que conseguir que iteratívamente nos muestre uno a uno hasta el final. Hay 7 campos porque este es el valor de NF (Number of fields). Ponemos el contador i=1, para que nos muestre el primer campo ($1) y hay que conseguir que aumente en una unidad (mediante i ++) sin que supere el último campo (NF).

      awk ‘ { for( i = 1; i <= NF; i ++ ) {print $i}}' distros.txt

      • La manera más práctica, fácil de recordar y que sirve para los dos sentidos es esta:
        cat distros.txt | tr ‘\n’ ‘ ‘ ← Salida stdout horizontal (Ya comentada más arriba)
        cat distros.txt | tr ‘ ‘ ‘\n’ ← Salida stdout vertical

        Saludos!

    • Definitívamente la solución de Etemenanki, en ambos sentidos, está muy bien si sólo interesa una simple transformación de fila a columna y viceversa.

Dejar una respuesta