Ayuda para seleccionar datos de un fichero usando comandos.

Imagen de hadrien
0 puntos

Hola,

soy nuevo en Ubuntu y debo tratar con ficheros y plotear los resultados pero no tengo ni idea de cómo seleccionar los datos que me interesan...

Por ejemplo, si tengo estas líneas:

Search files for iddir = 3146 with 983 files in 166.672000 seconds | 166.678009635 CPU seconds.
1 - Search surls for lfn idfile = 6270 with 78 surls in 11.937000 seconds | 11.9413500878 CPU seconds.
2 - Search surls for guid idfile = 6270 with 78 surls in 0.47000 seconds | 0.0446548374165 CPU seconds.
1 - Search surls for guid idfile = 7400 with 78 surls in 11.688000 seconds | 11.6901882781 CPU seconds.
2 - Search surls for lfn idfile = 7400 with 78 surls in 0.47000 seconds | 0.0469255170699 CPU seconds.

I sólo quiero los datos numéricos, de esta forma:
3146 983 166.672000
¿qué debo hacer para seleccionar estos datos y guardarlos así en un fichero? Sé que quizá podrían ser útiles los comandos grep y cut pero no sé cómo usarlos...
¿Alguien me puede echar un cable?

¡¡Muchas gracias de antemano!!

Imagen de joseluis
+1
0
-1

Movido desde Ayuda para principiantes


Equipo de Ubuntu-es

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de joseluis
+1
0
-1

Si los números están siempre en las mismas posiciones (contando por palabras) puedes volcar cada línea en un array de bash [1] y hacer referencia a las posiciones que en ese array ocupan los números.
Por ejemplo en la primera línea:

Search files for iddir = 3146 with 983 files in 166.672000 seconds | 166.678009635 CPU seconds.

los números que te interesan son las palabras que ocupan las posiciones 6, 8 y 11. Por tanto si esa línea la guardas en un array de bash únicamente tienes que hacer referencia al elemento sexto (${milinea[5]}), octavo (${milinea[7]}) y decimoprimero (${milinea[10]})

El principal problema que le veo es que las siguientes líneas no guardan el mismo orden con la primera:

1 - Search surls for lfn idfile = 6270 with 78 surls in 11.937000 seconds | 11.9413500878 CPU seconds.
2 - Search surls for guid idfile = 6270 with 78 surls in 0.47000 seconds | 0.0446548374165 CPU seconds.
1 - Search surls for guid idfile = 7400 with 78 surls in 11.688000 seconds | 11.6901882781 CPU seconds.
2 - Search surls for lfn idfile = 7400 with 78 surls in 0.47000 seconds | 0.0469255170699 CPU seconds.

ya que contienen dos palabras al principio de cada línea y otra palabra más antes del primer número, y en este caso las palabras que te interesan están en las posiciones 9, 11 y 14.
Este problema lo puedes evitar cortando (ya sabes man cut) cada línea utilizando el = como separador y quedandote con la segunda parte (lo que está a la derecha del =), de esa forma las líneas del fichero, al procesarlas con el cut te quedarían:

3146 with 983 files in 166.672000 seconds | 166.678009635 CPU seconds.
6270 with 78 surls in 11.937000 seconds | 11.9413500878 CPU seconds.
6270 with 78 surls in 0.47000 seconds | 0.0446548374165 CPU seconds.
7400 with 78 surls in 11.688000 seconds | 11.6901882781 CPU seconds.
7400 with 78 surls in 0.47000 seconds | 0.0469255170699 CPU seconds.

y ahora sí tienes que para todas las líneas los números ocupan la misma posición (1, 3 y 6).

Obviamente si no puedes garantizar que las líneas sean todas de ese tipo no te serviría lo anterior.

[1] Si no conoces los arrays de bash, en esta entrada hice una breve introducción sobre como se manejan, también puedes ver ahí un breve ejemplo sobre como leer un fichero para tratar línea a línea.


Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de slap
+1
0
-1

Otra opción, además de la que te indica joseluis, es usar expresiones regulares para sacar la información que te interesa.
Con sed sería algo así (suponiendo que los datos de entrada están en el archivo: texto.txt):

sed "s/^.* \([0-9]\+\) .* \([0-9]\+\) .* \([0-9]\+\.[0-9]\+\).*/\1 \2 \3/g" texto.txt 
3146 983 166.678009635
6270 78 11.9413500878
6270 78 0.0446548374165
7400 78 11.6901882781
7400 78 0.0469255170699

La salida la puedes redirigir a un archivo, cortar con cut, etc.

Saludos.
----
Slap

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de hadrien
+1
0
-1

Gracias por vuestra ayuda, al final lo solucioné usando la primera estrategia:

cut -d"=" -f2 fichero.dat > datos.dat
cut -d" " -f2,4,7 datos.dat > final.dat

Saludos.

+1
0
-1