Tengo un output.txt de ejecutar un script de shell de la siguiente manera:
abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016
El archivo de texto tiene múltiples entradas línea por línea de la misma manera. Quiero imprimir estos valores en columnas: Nombre de archivo, Estado y Marca de tiempo de la siguiente manera:
Filename Status Timestamp
abc.txt errorstatus1 Fri Nov 11 02:00:09 2016
def.txt errorstatus2 Sat Nov 12 03:00:09 2016
command-line
bash
scripts
text-processing
linux09
fuente
fuente
abc.txt,errorstatus1,Fri Nov 11 02:00:09 2016
. Edité su pregunta para que coincida con lo que dice con el ejemplo que proporcionó. Siéntase libre de retroceder, pero tenga en cuenta que realmente necesita aclarar qué es exactamente lo que quiere: valores en columnas o valores separados por comasRespuestas:
Con
paste
:esto generará el contenido del archivo separado de nueva línea como columnas y tres columnas separadas por tabulaciones por línea.
Agregar el encabezado:
Para columnizar la salida, tome ayuda de
column
:Ejemplo:
fuente
echo Filename,Status,Timestamp; paste -d ',' - - - <file.txt
Podrías usar awk:
La salida podría no ser tan bonita:
En su
%s\t
lugar, podría usar para resultados separados por tabulaciones.NR % 3
es cero (y falso) para cada tercera línea, por lo que las otras líneas se imprimen con un espacio después de ellas en lugar de una nueva línea.next
solo comienza la siguiente iteración.1
, con una nueva línea después, ya que no coincide con el primer bloque.fuente
También hay
rs
( utilidad BSD r e s hape):En particular,
Entonces
o (para agregar el encabezado)
fuente
Para completar, también puede hacer esto con
sed
:1iFilename\tStatus\tTimestamp
inserta la línea de encabezado antes de la línea 1N;N
lee dos líneas más en el buffer del patrón, dando un total de 3 líneas separadas por nueva líneay/\n/\t/
reemplaza todas las líneas nuevas con pestañas en el búfer de patronesLos comandos
i
,N
yy
sed se documentan aquí .fuente
Siempre es posible cocinar algo para el procesamiento de texto con AWK o Perl, y por supuesto Python, que es lo que proporciona esta respuesta.
Como one-liner:
Como secuencia de comandos de varias líneas
La idea básica aquí es proporcionar la entrada del script a través de stdin (usando la redirección de shell
<
, aunque también se puede usar una tubería). El script usa pestañas para separar los campos, aunque los espacios también podrían usarse para una salida más "afinada".Salida de muestra utilizando el ejemplo de entrada proporcionado por OP:
fuente