[opensuse-es] Mostrar lineas de un fichero
Hola, Seguro que hay alguna pequeña utilidad para hacer lo que busco, pero soy incapaz de encontrarlo. ¿Sabéis cómo se pueden mostrar algunas lineas de un fichero (por ej: las lineas 3,7,9 de un fichero de 50 lineas) en un shell script? Si lo hago con un bucle pierde mucho tiempo. He probado con "sed", pero sólo funciona si las lineas son contiguas. Gracias! -- Oscar Curero - Linux user: 306877 -- GPG keyID: 0xE0EA0B24 -- -- Para dar de baja la suscripción, mande un mensaje a: opensuse-es+unsubscribe@opensuse.org Para obtener el resto de direcciones-comando, mande un mensaje a: opensuse-es+help@opensuse.org
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 El 2008-11-06 a las 22:49 +0100, Oscar Curero escribió:
Seguro que hay alguna pequeña utilidad para hacer lo que busco, pero soy incapaz de encontrarlo.
Directamente no...
¿Sabéis cómo se pueden mostrar algunas lineas de un fichero (por ej: las lineas 3,7,9 de un fichero de 50 lineas) en un shell script?
Una manera es combinando head y tail: head --lines=5 lineas | tail --lines=1 o tail --lines=6 lineas | head --lines=1 Eso saca la linea numero 5. Si quieres de la 5 a la 7: tail --lines=6 lineas | head --lines=3 o de la 3 a la 5 (o sea, las 3 <=) head --lines=5 lineas | tail --lines=3 Para lo que tu quieres: head --lines=3 lineas | tail --lines=1 > salida head --lines=7 lineas | tail --lines=1 >> salida head --lines=9 lineas | tail --lines=1 >> salida
Si lo hago con un bucle pierde mucho tiempo. He probado con "sed", pero sólo funciona si las lineas son contiguas.
Pues una a una y a un fichero, concatenando. - -- Saludos Carlos E.R. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEARECAAYFAkkTeAEACgkQtTMYHG2NR9W7VgCfd4k3aADR2L233DFk2R3AkaiD ABEAn17iOfPGNs3D+yTVyvdWkEE6OaNJ =JZpl -----END PGP SIGNATURE-----
Oscar Curero wrote:
Hola,
Seguro que hay alguna pequeña utilidad para hacer lo que busco, pero soy incapaz de encontrarlo.
¿Sabéis cómo se pueden mostrar algunas lineas de un fichero (por ej: las lineas 3,7,9 de un fichero de 50 lineas) en un shell script?
Si lo hago con un bucle pierde mucho tiempo. He probado con "sed", pero sólo funciona si las lineas son contiguas.
Gracias! Mi version en awk fallo miserablemente, asi que aqui va mi version en python
gherzig@comechingon:~> cat algunaslineas.py #! /usr/bin/python import sys archivo = sys.argv[1] lineas = sys.argv[2:] print ''.join([x[1] for x in enumerate(open(archivo).xreadlines()) if str(x[0]+1) in lineas]) gherzig@comechingon:~> chmod 755 algunaslineas.py gherzig@comechingon:~> ./algunaslineas.py /etc/passwd 1 2 16 at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash avahi:x:103:105:User for Avahi:/var/run/avahi-daemon:/bin/false polkituser:x:104:106:PolicyKit:/var/run/PolicyKit:/bin/false Saludos. Gerardo -- Para dar de baja la suscripción, mande un mensaje a: opensuse-es+unsubscribe@opensuse.org Para obtener el resto de direcciones-comando, mande un mensaje a: opensuse-es+help@opensuse.org
Gerardo Herzig vàreu escriure:
Oscar Curero wrote:
Hola,
Seguro que hay alguna pequeña utilidad para hacer lo que busco, pero soy incapaz de encontrarlo.
¿Sabéis cómo se pueden mostrar algunas lineas de un fichero (por ej: las lineas 3,7,9 de un fichero de 50 lineas) en un shell script?
Si lo hago con un bucle pierde mucho tiempo. He probado con "sed", pero sólo funciona si las lineas son contiguas.
Gracias!
Mi version en awk fallo miserablemente, asi que aqui va mi version en python
gherzig@comechingon:~> cat algunaslineas.py #! /usr/bin/python import sys archivo = sys.argv[1] lineas = sys.argv[2:] print ''.join([x[1] for x in enumerate(open(archivo).xreadlines()) if str(x[0]+1) in lineas])
gherzig@comechingon:~> chmod 755 algunaslineas.py gherzig@comechingon:~> ./algunaslineas.py /etc/passwd 1 2 16 at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash avahi:x:103:105:User for Avahi:/var/run/avahi-daemon:/bin/false polkituser:x:104:106:PolicyKit:/var/run/PolicyKit:/bin/false
Mi propuesta: oscar@hedera:~> cat lineas2.sh #!/bin/bash for numline in $2 do sed -n "$numline p" "$1" done oscar@hedera:~> time ./lineas2.sh /etc/services "3 6 9 1" # # even if the protocol doesn't support UDP operations. # http://www.iana.org/assignments/port-numbers # real 0m0.618s user 0m0.580s sys 0m0.016s La tuya: oscar@hedera:~> time ./lineas.py /etc/services 3 6 9 1 # # # even if the protocol doesn't support UDP operations. # http://www.iana.org/assignments/port-numbers real 0m0.139s user 0m0.116s sys 0m0.020s Con tu permiso, me quedo la tuya :)
Saludos. Gerardo
Saludos, -- Oscar Curero - Linux user: 306877 -- GPG keyID: 0xE0EA0B24 -- -- Para dar de baja la suscripción, mande un mensaje a: opensuse-es+unsubscribe@opensuse.org Para obtener el resto de direcciones-comando, mande un mensaje a: opensuse-es+help@opensuse.org
participants (3)
-
Carlos E. R.
-
Gerardo Herzig
-
Oscar Curero