Script para buscar datos en un .txt

Iniciado por chulas2106, 14 Enero 2015, 13:10 PM

0 Miembros y 1 Visitante están viendo este tema.

chulas2106

Hola, lo que pasa es que me han contratado en la administracion de un centro de dialisis, y muy a menudo me piden informacion de pacientes que no conozco y tengo que abrir un cuaderno y buscarlos, eso es MUY tedioso.... lo que hice fue agarrar un archivo .xlsx (excel hecho en windows) de la empresa y pasar la informacion a un archivo .txt, la acomode porque al copiarla de un excel sale toda desordenada  ("acomodar" es 15min tabulando) yla pase a mi notbook personal, donde tengo un script en bash que lo que hace es simplemente pedir el nombre del fichero y la palabra/frase a buscar y lo busca por medio del comando grep... el script funciona, el problema es que como son muchos datos en una sola linea la terminal los imprime en 2 y queda, por ejemplo la direccion en dos lineas, mi preunta es si hay alguna forma de hacer que se muestre toda la informacion en una sola liena...
Otra cosa que me seria muy util es poder mostrar "nombres de columnas" osea que el resultado sea algo parecido a esto:
NOMBRE                       DOMICILIO                          TELEFONO                ETC
señor x                          calle falsa 123                     7578592945         rg
señora y                        calle hola 456                      135068y358           ryr

Por si sirve de algo aqui va el codigo
#!/bin/bash
#Este es una prueba de un script para buscar datos en una lista
#escrita en un archivo de texto...
clear
read -p "Indique el archivo a analizar..." txt
echo Usted ha indicado el fichero $txt ...

read -p "Que desea buscar en el fichero? " dat
echo Procediendo a buscar $dat en $txt
grep $dat /root/Downloads/$txt

Black Dragon

Si tienes un XLS o un XLSX puedes guardarlo como un CSV (Coma Separated Values).
Básicamente es un archivo de texto en el que separa los valores con comas y las filas por lineas en el archivo.
Asegúrate que se guarda como UTF-8 y con los saltos de linea de linux. Si no fuese así ábrelo en tu editor de texto favorito y guárdalo como tal.

El grep a mi me da justo lo que pones en la tabla. Lo mas probable es que fuese problema de los saltos de linea que comenté antes.

Para intercambiar las "," por \t con un sed es bastante sencillo de hacer.
La primera fila se puede sacar con un head -n1 archivo.csv y aplicarle un sed como antes.

Yo interpreto la entrada como:
entrada.csv:
"NOMBRE","DOMICILIO","TELEFONO","ETC"
"señor x","calle falsa 123",7578592945,"rg"
"señora y","calle hola 456",135068345358,"ryr"
"señ z y","calle sdfa 456",1353453358,"rsdfsdfr"
"seaaa x a e","calsgfdgh hola 456",135068358,"rqasdyr"


El código en bash editando un pelin el tuyo me quedará como
Código (bash) [Seleccionar]
#!/bin/bash
#Este es una prueba de un script para buscar datos en una lista
#escrita en un archivo de texto...
clear
txt="entrada.csv"
#read -p "Indique el archivo a analizar..." txt
echo Usted ha indicado el fichero $txt ...

#read -p "Que desea buscar en el fichero? " dat
dat="x"
echo "Procediendo a buscar $dat en $txt"
head -n1 $txt |sed "s/,/\t/g"|sed "s/\"//g"
grep $dat $txt|sed "s/,/\t/g"


Solo he editado las entradas un pelin, agregado los sed y el head.

El primer problema que le encuentro a mi script es que depende mucho del tamaño de los campos de texto y lo mas probable es que aparezcan en columnas distintas y el texto se mueva de su "sitio". Así que se necesitaría hacer de alguna forma dinámica la colocación de las tabulaciones. Pero ahora no tengo mucho tiempo para ello.

Quizá lo he entendido todo mal! jeje espero almenos haber ayudado en algo! ^^.
Un saludo

vk496

Cuando hay separaciones irregulares (tabulaciones y espacios), recomiendo usar awk

Por ejemplo, si tienes un archivo así, puedes hacer esto:

cat miarchivo.txt | awk '{print $1,$2,$3,$4}'

Esto "regularizaria" esos separadores. Espero haberte dado ideas

Salu2

chulas2106

BlackDragon Gracias por tu respuesta!!! lo del head me sirvio, ahora se ven los nombres en las columnas, y he llegado a la conclusion de que el desorden de los datos es debido al tamaño de mi pantalla (olvide mencionar que estoy en una netbook jeje) asique ya voy a probar en un monitor mas grande para ver si asi funciona...

vk496 No entendi lo que pusiste podrias explicarlo??

Black Dragon

Lo que comenta vk496 es que se puede formatear de forma sencilla usando awk.
He hecho varias pruebas y esto es lo que he sacado con awk.
Debes tener en cuenta el tamaño máximo de cada valor de la tabla. Asi pues yo he deducido al alza que el nombre no debería exceder los 35 caracteres, el domicilio los 35 caracteres me parece tb bien, el teléfono unos 9 o 10 caracteres por si las moscas le puse 12 y el etc a saber, te toca a ti.
Intenta mirar otros tipos de resultados dependiendo de tus valores en el csv.

Usando el comando awk como
Código (bash) [Seleccionar]

head -n1 entrada.csv|awk -F, '{printf "%-35s\t%-35s\t%-10s\t%-35s\n",  $1, $2, $3, $4}'|sed "s/\"//g"


En este caso cogemos la primera linea del archivo entrada.csv y se lo pasamos a awk que detecta la separación de las comas con -F, y luego imprime las 4 primeras columnas de la forma en la que le dice el printf. El primero %-35s significa que pilla $1 y lo usa como string y le pone al final los necesarios espacios hasta llegar a 35 caracteres. Si se excede pues no pone nada.
El resto de parámetros es lo mismo. El único problema es que necesitas una pantalla grandecita para poder ver contenido real. Un nombre puede ser muy largo y no solo un "asds".
Luego el sed quita los ".

asi que en general creo que se puede usar algo como:
Código (bash) [Seleccionar]
head -n1 entrada.csv|awk -F, '{printf "%-35s\t%-35s\t%-10s\t%-35s\n",  $1, $2, $3, $4}'|sed "s/\"//g"
grep $dat $txt|awk -F, '{printf "%-35s\t%-35s\t%-10s\t%-35s\n",  $1, $2, $3, $4}'|sed "s/\"//g"


Supongo que ajustarlo es cosa tuya.

MinusFour

#5
Me gusta la idea de AWK para formatear tu CSV:

Código (bash) [Seleccionar]

awk 'BEGIN {FS=","}{ printf "%-50s %-50s %s\n",$1,$2,$3}' archivo.csv


Código (text) [Seleccionar]

TestA,calle rosas,100
TestB,calle tierra,101
TestC,calle nunu,102


Resultado:



Y esto lo puedes hacer una funcion de bash facilmente, en tu .bashrc:

Código (bash) [Seleccionar]

function despliegaLista {
 awk 'BEGIN {FS=","}{ printf "%-50s %-50s %s\n",$1,$2,$3}' $1
}


Y si quieres buscar solo haces:
Código (bash) [Seleccionar]

despliegaLista archivo.csv | grep "Busqueda aqui"

el-brujo

¡oh! el foro ya parece stackoverflow.com hehehe  :D

También puedes usar Notepad++ o SublimeText para hacer búsquedas complejas en Windows, con expresiones regulares.

Manual Notepad++: ejemplos de uso plugin TextFX
http://blog.elhacker.net/2014/10/manual-tutorial-notepad-plus-plus-bloc-de-notas-textfx-plugin.html

Eleкtro

#7
Cita de: el-brujo en 14 Enero 2015, 17:33 PM¡oh! el foro ya parece stackoverflow.com hehehe  :D
Este es el ambiente que me gusta a mi en el foro, jaja!, que siga así.




Como ha comentado el compañero, señor, amo, y todo poderoso @el-brujo, una solución simple y sencilla sería utilizar Sublime Text + RegEx,
es a lo que yo suelo recurrir debido a los beneficios que ofrece un editor de texto, por lo manejable que es una GUI, ya que puedes hacer correcciones o modificaciones, rehacer y deshacer en tiempo reeal y ver las capturas del RegEx practicamente al instante, es mucho mejor que utilizar SED o herramientas parecidas commandline y el tiempo de espera que ello supone, ¡donde va a parar! ...a menos que tu propósito sea automatizar la tarea sin interacción del usuario, claro está.

(el problema sería reproducir la funcinalidad de una aplicación como head/tail, quizás exista una opción en Sublme Text o algún plugin de terceros)

Saludos!