como borrar solamente una linea de un fichero

Imagen de emptyyy
0 puntos

Wenas gente , estoy haciendo un script que trabaja con un fichero txt en el cual tras consultar unos datos debe borrar solamente una linea del fichero. No se como hacerlo... me he estado informado y he leido algo sobre el comando sed pero la verdad que ando bastante perdio.. no se ni como empezar la verdad

Alguna ayudita?? gracias

saludos emptyyy =)

Imagen de CHuLoYo
+1
0
-1

sed "s/linea o patrón buscado/ reemplazo" /home/user/archivo.txt > /tmp/archivo.tmp
sudo mv /tmp/archivo.tmp /home/user/archivo2.txt

AprendeProgramacion.net

+1
0
-1
Imagen de emptyyy
+1
0
-1

Perdona pero no entiendo muy bien como funciona lo que as escrito.. me lo podrias explicar mejor?

gracias

+1
0
-1
Imagen de CHuLoYo
+1
0
-1

Lo que hemos hecho en la primera línea es utilizar el comando sed para buscar una línea o un patrón mediante s/ y luego un espacio y el reemplazo, en este caso sería vacío porque la quieres eliminar. Todo ello buscado en un supuesto /home/user/archivo.txt y se reescribe el archivo nuevo generado en /tmp/archivo.tmp

Luego con el segundo comando se mueve el /tmp/archivo.tmp a /home/user/archivo2.txt con lo que tendrás aquí tu nuevo arcihvo sin la línea que querías.

AprendeProgramacion.net

+1
0
-1
Imagen de joseluis
+1
0
-1

Por ejemplo si quieres borrar la quinta línea del fichero prueba1 podrías hacer lo siguiente (o algo parecido):

cat - << EOF | ed -s prueba1
5,5 d
w prueba2
q
EOF

Luego lo único que te quedaría hacer es mover el resultado (fichero prueba2) a prueba1


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 emptyyy
+1
0
-1

Muchas gracias por responder ,lo he probado y de lo que me he enterado es que con el EOF cierrar y abres la instruccion , pero no se ,no entiendo muy bien lo de w prueba2 y la q

muchas gracias

saludos =)

+1
0
-1
Imagen de joseluis
+1
0
-1

Sí, el <<EOF (o en lugar de EOF lo que quieras poner) es para pasarle una serie de instrucciones a un comando (en este caso el ed). Lo que ocurre es que lo cogí de un ejemplo del man del ed y no me paré a pensarlo mucho, yo realmente hubiera hecho lo siguiente:

ed -s prueba1 << HASTAAQUI
5,5 d
w prueba2
q
HASTAAQUI

Te explico paso a paso:

  • con ed -s prueba1 lo que se hace es invocar el editor de línea ed diciéndole que abra el fichero prueba1
  • con << HASTAAQUI estamos diciendo a la shell que lo que viene a continuación y hasta que se encuentre la palabra HASTAAQUI no lo debe procesar la shell sino (en este caso) el comando ed
  • 5,5 d es un comando del editor ed que le dice que borre de la línea 5 a la línea 5 (la d es de delete), el borrado no lo hace directamente en el fichero sino sobre lo que tiene cargado en memoria
  • w prueba2 es otro comando de ed que le indica que debe "volcar" (grabar) lo que tiene en memoria (el contenido del prueba1 menos la línea 5) en prueba2 (si se deseara grabar directamente sobre prueba1 lo único que habría que poner es w sin especificar el nombre del fichero, y en ese caso grabaría los cambios en el fichero que está editando)
  • q indica a ed que se debe salir del modo edición
  • HASTAAQUI indica a bash que ya ha acabado de "enviarle" comandos a ed

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 emptyyy
+1
0
-1

Muchas gracias , la verdad que por lo menos ya se la idea .. ahora me toca pelearme con me script para que primero compruebe que el dato esta en el fichero, despues que borre la linea que contiene el dato introducido por pantalla y que lo actualize.. vamos mas lio aun XDDD

pero bueno si tengo dudas os lo comentaree

gracias otra vez, de verdad que con gente con vosotros da gusto aprender

saludos empty

+1
0
-1
Imagen de emptyyy
+1
0
-1

bueno teniendo un poco de tiempo he estado provando lo que me habeis dicho y la verdad que muchas gracias .. pero lo que tengo que hacer es mas complicado, no me funciona ,no se si por sinxtasis (no dice nada de errorer) porque coje mal las funciones o no se,estoy perdido una ayudita??
Os pongo el codigo fuente y me comentais

#!/bin/bash
IFS="
"
echo -e "introduce numero"
read NUM
for COM in `cat pruebalinea.txt`
do
CAMPO=`echo $COM |cut -d ":" -f1`
LINEA=`echo $COM | grep $NUM
then

ed -s pruebalinea.txt << HASTAAQUI
$LINEA ,$LINEA d
w borradolinea.txt
q
HASTAAQUI

cat borradolinea.txt > pruebalinea.txt
rm borradolinea.txt

fi
done

Lo que pretendo al ejecutar el shell es que al introduccir un numero por teclado ,me lo compruebe que existe y si de verdad existe lo borre del fichero. Lo que me ejecuta es que al meter un numero me sale una interrogacion

ayuda y mil gracias

saludos empty

+1
0
-1
Imagen de joseluis
+1
0
-1

Me temo que no ha salido completo el script, supongo que por el formateo html.

Imagino que en el script tendrás algún < y eso hace que interprete lo que viene a continuación como una etiqueta html y por eso no se muestra bien en el foro. Sustituye los < utilizando el botón < (que aparece en la regleta de edición, verás que en lugar de < te pone &lt; que es el código html para sacar ese carácter), igualmente cambia también otros caracteres que pueden ser problemáticos como el & si los usaras también (obviamente cuando digo que lo cambies no me refiero al script en sí, sino a cuando transcribas el script en el foro).

Además convendría que pusieras el contenido del fichero pruebalinea.txt para poder probarlo mejor.


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 emptyyy
+1
0
-1

Si es verdad , no me habia dao cuenta como se habia posteado jeje perdon

pos haber posteado de nuevo quedaria asi:

#!/bin/bash
IFS="
"
echo -e "introduce el DNI del empleado"
read DNI
for COM in `cat pruebalinea.txt`
do
CAMPO=`echo $COM |cut -d ":" -f1`
LINEA=`echo $COM | grep $DNI`
if [ $CAMPO = "$DNI" ]
then

ed -s pruebalinea.txt << HASTAAQUI
$LINEA ,$LINEA d
w borradolinea.txt
q
HASTAAQUI

cat borradolinea.txt > pruebalinea.txt
rm borradolinea.txt

fi
done

vale el contenido del fichero pruebalinea.txt es un texto sencillo que contiene 10 lineas enumeradas con las diez letras correspondientes al alfabeto separas por dos puntos (que es el caracter separador)
1:a
2:b
3:c
4:d
5:e
6:f
7:g
8:h
9:i
10:j

de tal manera,que al ejecutar el scrip ,preguntara que "DNI" deseo borrar ,al pulsar 1-10 debera borrar la linea correspondiente al numero introducido

Espero haberme explicado mejor y gracias por la ayuda

saludos empty =)

+1
0
-1
Imagen de joseluis
+1
0
-1

Creo que la línea

LINEA=`echo $COM | grep $DNI`

debería ser

LINEA=`echo $CAMPO | grep $DNI`

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 emptyyy
+1
0
-1

Muchas gracias tio ,perdon por la expresion pero eres el "putisimo amo" gracias de verdad y sigo con mi shell , si me quedo atascado lo comunico haber si me podeis echar una mano

de verdad , muchas gracias

saludos emptyyy=)

+1
0
-1
Imagen de emptyyy
+1
0
-1

ola buenas , he encontrado otra manera mas "asequible " de borrar una linea de ficheros ,mas asociada a mi nivel y a lo que yo pretendo conseguir con lo que me han enseñado mi problema es .. que cuando el DNI del empleado no existe , dice que no existe (como deberia hacer ) pero me sale una linea de error "[: 165: =: unexpected operator"

voy a la linea 165 y solo tengo "done" que finaliza el programa

alguien me puede decir a primeras porque es esto?? y si necesitais algo decirmelo

Os pongo algo del codigo (aunque omito cosas que es muy largo y no creo que tenga que ver el problema)

#!/bin/bash
IFS="
"

###################################################################################################
clear
muestraopcionesmenuprin() {

echo " MENÚ DE OPCIONES"
echo '====================='
echo '[A]ltas'
echo '[B]ajas'
echo '[C]onsultas'
echo '[O]rdenacion'
echo '[S]alir'
echo " "
echo " "
echo "Elija opcion (A,B,C,O,S):"
}
###################################################################################################
submenubaja() {
DNI=b

echo -e "introduce el DNI del empleado"
read DNI

CAMPO=`grep "^$DNI" empleados.txt |cut -d ":" -f1`

if [ $CAMPO = $DNI ]
then

grep -v "^$DNI" empleados.txt > borradolinea.txt
cat borradolinea.txt > empleados.txt
rm borradolinea.txt
return
fi

echo "el empleado ya existe "
submenubaja

}
##################################################################################################
############################################# MAIN ################################################
###################################################################################################
while true
do

muestraopcionesmenuprin
read OPT
clear
case $OPT in

A) submenualta;;
B) submenubaja;;
C) submenuconsultar;;
O) submenuordenar;;
S) exit;;
*) echo "$OPT opcion incorrecta, Elija opcion (A,B,C,O,S):";;
esac
done

+1
0
-1
Imagen de emptyyy
+1
0
-1

gracias ya encontre la forma de arreglarlo.. al final era una tonteria

por cierto alguien sabe como ordenar un fichero txt por el segundo campo?? creo que es con el comando sort pero estoy buscando informacion acerca del comando y no encuentro nada relacionado con lo que pretendo

alguna ayuda?? gracias

saludos empty=)

+1
0
-1
Imagen de joseluis
+1
0
-1

sort -n -t";" -k 2  tufichero
  • -n -> ordenación numérica
  • -t";" -> el carácter de separación de campos es el ;
  • -k 2 -> utiliza el segundo campo
  • tufichero -> pues eso, el nombre del fichero que quieres ordenar

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 emptyyy
+1
0
-1

pfff. gracias la verdad que me estas ayudando mucho otra cosa aber si me terminais de dar la idea , para ordenar el fichero tengo una cabecera donde dice lo que es cada campo y claro para ordenarla la tengo que quitar. Estoy en el punto de que le he asignado una variable(a) a la cabecera (por comodidad) y ahora tengo dos caminos

1- Con un tail -numero de lineas -1 , pero el problema que no se cuantas lineas tiene el fichero , uso el wc -l para averiguarlo y a esto le asigno otra variable (b) entonces queda la cosa cat fichero | tail -$b -1 , no funciona ya que no se quitarle un valor a la variable (no se si me explico )

2- con un grep -v "^a" > aux
aux > fichero
rm aux

tampoco me funciona

alguna idea ,ando bastante perdido por los dos caminos ,seguire intentandolo mientra espero vuestra ayuda

gracias y saludos emptyyy =)

+1
0
-1
Imagen de joseluis
+1
0
-1

Para restar/sumar/multiplicar/... en bash tienes que encerrar la operación a realizar dentro de $(()), es decir si quieres sumar las variables v1 y v2 y guardarlas en v3 tendrías que hacer:

v3=$(($v1+$v2))

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 joseluis
+1
0
-1

Ya que pareces bastante interesado en el mundillo de los scripts de bash tal vez te convendría leer algún manual de bash, por ejemplo http://doc.ubuntu-es.org/Bash


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 emptyyy
+1
0
-1

muchas gracias y me echare un vistazo al manual gracias y para la proxima duda que tenga con mi shell

saludos empty

+1
0
-1
Imagen de emptyyy
+1
0
-1

Wenas sigo editando mi shell y me he quedado atascado ahora en que tengo que comparar los datos introducidos por teclado con los datos que tengo en el fichero.Para ello utilizo el comando grep que busca donde se encuentra los datos y muestra la linea , pero para mi sospresa si introduzco el dni 12 me lo lee correctamente si a continuacion añado el dni 1212 y le doy a consultar datos me consulta los datos del 1212 ,pero hay vuelvo a consultar los datos del dni 12 y me dice que no existe

alguna idea de como arreglar esto???
mi codigo fuente:

################################################################

ACONSULTAR=b

echo -e "introduce el DNI del empleado que quieras consultar"
read ACONSULTAR

DNI=`grep "^$ACONSULTAR" empleados.txt |cut -d ":" -f 1`

if [[ $ACONSULTAR == $DNI ]]
then
echo `grep "^$DNI" empleados.txt`
pausa
return
else
echo "el empleado que quiere usted consultar no existe ,por favor introduce los datos correctamente"
pausa
fi

###############################################

saludos y gracias

+1
0
-1