Saltar al contenido

Cambiar separadores de columnas en un archivo

Te sugerimos que revises esta respuesta en un ambiente controlado antes de enviarlo a producción, un saludo.

Solución:

tr ' ' 't' < file 1<> file

Reemplazaría cada carácter de espacio con un carácter de tabulación.


Solo para responder a las personas que dicen que no es seguro:

El shell abrirá el archivo para leer en el descriptor de archivo 0 y para leer y escribir en el descriptor de archivo 1. Si alguno de ellos falla, se rescatará, tr ni siquiera será ejecutado. Si las redirecciones tienen éxito, tr es ejecutado.

tr leerá el archivo un bloque a la vez, hará la transliteración y generará el bloque modificado sobre el no modificado.

Al hacerlo, generalmente no necesitará asignar ningún espacio en el disco. La excepción a esto sería si el archivo fuera escaso al principio, o si los sistemas de archivos implementan la copia en escritura. Por lo tanto, no es probable que se produzcan errores de “no hay espacio disponible”.

Sin embargo, pueden ocurrir otros errores, como un error de E/S, si el disco subyacente está fallando, o si el sistema de archivos está en un dispositivo de bloque que ha sido aprovisionado de forma delgada (como una instantánea de LVM), ambas condiciones son raras y, de todos modos, probablemente impliquen traer hacer una copia de seguridad.

En todo caso, en caso de incumplimiento del write() llamada al sistema, tr debe informar un error y salir. Debido a que su salida estándar está abierta en modo de lectura y escritura, no ser truncado. Para que el archivo sea truncado, tr tendría que llamar explícitamente truncate() en su salida estándar al salir, lo que no tendría sentido.

Sin embargo, lo que sucedería sería que el archivo se transcribiría parcialmente (hasta el punto en que tr ha fallado).

Sin embargo, lo que descubrí es que GNU tr que se encuentra actualmente en Debian sid amd64 tiene un error en el que se produce un error de segmento cuando falla el write() llamada al sistema y salida de basura en stdout (editar, ahora corregido desde la versión 2.19-1 del paquete libc6 Debian). Eso en realidad corrompería el archivo (pero nuevamente no lo truncaría).

tr ' ' 't' < file > newfile && mv newfile file

no reemplazaría file a menos que el newfile se ha creado correctamente, pero tiene una serie de problemas asociados con él:

  • debe asegurarse de no aplastar una ya existente newfile (piense también en enlaces simbólicos)
  • Necesita acceso de escritura al directorio actual
  • necesita espacio de almacenamiento adicional para esa copia adicional del archivo
  • está perdiendo los permisos, la propiedad, la hora de nacimiento, la extensión attributes… del archivo original
  • si el archivo original era un enlace simbólico, lo reemplazará con uno normal.

tr ' ' 't' < file 1<> file es más seguro que el de uso común perl -pi -e 's/ /t/g' porque al fallar perl (como en el disco lleno), pierde el archivo original y solo obtiene lo que perl ha logrado producir hasta ahora.

Puedes usar sed también.

sed -i.bak 's/ /t/g' filename

Esto creará un filename.bak antes de editar el archivo.

s/ /t/g => Esto dice sed para sustituir un espacio con el carácter de tabulación globalmente en cada línea del archivo.

Reseñas y valoraciones del tutorial

Si te gusta este mundo, puedes dejar un enunciado acerca de qué te ha gustado de esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *