es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo convertir un archivo .txt con entradas en diferentes líneas a .csv en Linux?

He usado exiftool para crear archivos .txt con los datos EXIF de algunas imágenes y videos con los que estoy trabajando. Eventualmente, también necesitaré crear manifiestos .csv para estos archivos, y sé que hay formas simples de convertir archivos .txt en archivos .csv, pero las instrucciones que he encontrado describen cómo hacerlo si el archivo .txt tiene información que debe ir en diferentes columnas dentro de la misma línea, mientras que los míos están en diferentes líneas. ¿Existe una forma de realizar esta conversión con archivos .txt organizados de manera diferente?

Por ejemplo, he visto instrucciones sobre cómo convertir algo como esto:

filename   date       size
abc.JPG    1/1/2001   1MB
def.JPG    1/1/2001   1MB
hij.JPG    1/1/2001   1MB

a

filename,date,size
abc.JPG,1/1/2001,1MB
def.JPG,1/1/2001,1MB
hij.JPG,1/1/2001,1MB

Los archivos .txt que tengo, por otro lado, están formateados de esta manera:

========abc.JPG
Nombre de archivo    abc.JPG
Fecha/Hora original  2001:01:01 1:00:00
Tamaño               1 MB
========def.JPG
Nombre de archivo    def.JPG
Fecha/Hora original  2001:01:01 1:01:00
Tamaño               1 MB
========hij.JPG
Nombre de archivo    hij.JPG
Fecha/Hora original  2001:01:01 1:02:00
Tamaño               1 MB

pero aún necesito una salida como esta:

filename,date,size
abc.JPG,2001:01:01 1:00:00,1 MB
def.JPG,2001:01:01 1:01:00,1 MB
hij.JPG,2001:01:01 1:02:00,1 MB
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es usar una combinación de comandos awk y tr en la terminal.

    En primer lugar, necesitamos reemplazar los caracteres “=” con un espacio para que cada línea se convierta en una sola línea. Podemos hacer esto con el comando tr:

    tr '=' ' ' < input.txt > output.txt

    A continuación, podemos usar awk para extraer los campos que necesitamos, en función de la posición del texto en cada línea. Podemos asignar cada campo a una variable y luego imprimir las variables con el formato deseado:

    awk '/Nombre de archivo/{f=$NF} /DateTime Original/{d=$NF} /Size/{s=$NF} /^$/{printf "%s,%s,%s\n",f,d,s}' output.txt > final.csv

    Este comando busca líneas que contengan el texto “Nombre de archivo”, “Fecha/Hora Original” y “Tamaño” y extrae el último campo de cada línea (que contiene los datos que necesitamos). Luego asigna cada campo a una variable y utiliza una línea en blanco como disparador para imprimir las variables en el formato deseado (separadas por comas).

    La salida de este comando será un archivo .csv con el formato “nombre de archivo, fecha, tamaño”.

Comments are closed.