Quitar brackets? -- RESUELTO

Imagen de AllanPoe
0 puntos

Hola! Soy nuevo en esto de la Shell y ando un poco perdido. Quiero hacer un script que lea todos lo ficheros .csv que tenga en una carpeta para quitarle todos los corchetes que aparezcan en él. Después de muchas horas intentándolo tengo el siguiente código:

for i in *.csv; do tr -d [:punct:] < %i > clean%i; done

Funciona perfecto cuando solo tengo un fichero, pero en el momento que tengo más de uno me aparece un error diciendo que la redirección es ambigua. Alguna idea? Muchas gracias!!

------------------

Muchas gracias por vuestras respuestas! He resuelto el problema gracias a vuestra ayuda! :)

Imagen de JAVIER NAVARRO ALTIMIRA
+1
+1
-1

#!/bin/bash
#
# script para eliminar los brackets de archivos csv, se
# ha cambiado [:puntc:] para evitar el borrado de
# otros carácteres de puntuación que quizas no se
# quieran borrar
#
# listar todos los *.csv
for i in `ls *.csv`
do
# crear un nombre archivo temporal
temp=`tempfile`
# elimina los brackets y deposita el resultaod
# en el archivo temporal
cat $i | tr -d "[" | tr -d "]" > $temp
# mueve el temporal al archivo original
mv -v -f $temp $i
done

echo -n "Pulsa enter para salir . . . " && read

+1
+1
-1
Imagen de pwned
+1
+1
-1

@AllanPoe
Te da error por que usas el *.csv y la salida que genera es una línea con todos los archivo seguidos. Por eso cuando solo tienes un archivo no hay problema, pero si tienes más de uno se concatenan, por ejemplo: archivo1 archivo2 ...

@JAVIER NAVARRO
La idea esta bien planteada pero... unos pequeños consejos. Tu code solo iria bien si los nombres de los ficheros '.csv' estan sin espacios, en el momento en que un archivo tenga espacios te dará error al intentar hacer un 'cat' a un archivo desconocido.
Pensaras que con ponerle comillas a la variable "$i" que contiene el nombre del fichero se soluciona... NO.
Y a lo que quiero llegar, es un error muy común el usar `cmd` o $(cmd) en bucles for, pero esto NUNCA se debe hacer si se quiere trabajar con salidas de comando que impliquen nombres de ficheros o lineas de ficheros.
El bucle for tratará las salidas de los comandos como meras strings, no como la salida del comando "normal" y solo debe ser usado con expansiones. Por eso, por muchas comillas que pongas al hacer el 'cat' te seguirá dando error para archivos espaciados.

La forma correcta de hacerlo es así:

1 ls *.csv | while read -r line; do
2 cat "$line" | ...
3 done

Saludos.

+1
+1
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

#!/bin/bash
function analiza()
{
DIRECTORIO="`mktemp -d`" # crea un directorio temporal
cd "$DIRECTORIO" # entra en el directorio creado
cp "$1" "$DIRECTORIO"/"`basename $1`" # copia el archivo pasado como parámetro
split -l 1 -a 4 "$1" # lo parte linea a linea
rm "`basename $1`" # lo borra, aqui ya no es necesario
# aqui procesar archivo a archivo (uno en cada linea)
for archivo in `ls *`
do
# muestra el archivo, aqui se podria
# hacer cualquier cosa con el archivo
# en este caso es un listado de $OLDPWD,
# por tanto si se quisieran procesar los
# csv se podria hacer cualquier cosa teniendo
# en cuenta que estan situados en el directorio
# original
echo "$OLDPWD"/"`cat $archivo`" # esto solo muestra el contenido
done
cd "$OLDPWD" # vuelve al padre
rm -r "$DIRECTORIO" # esto ya no es necesario
}

# lista los archivos cvs
temporal="`tempfile`"
ls *.csv > "$temporal"

analiza "$temporal"

+1
0
-1
Imagen de pwned
+1
0
-1

No creo que sea necesario un codigo de esa magnitud para lo que pide el usuario @AllanPoe.
Y el resultado de hacer un codigo tan enrevesado es que puede contener errores, y en este caso no borra todos los temporales que crea.
A parte el resultado final de su código no es muy distinto de hacer un `ls -1 *.csv', cosa que no concuerda con lo que pide el usuario @AllanPoe ...

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

No es necesario y por supuesto es mejorable, pero eso pasa con cualquier programa tanto si el que lo programa es un aficionado como yo o un profesional. Yo simplemente lo mando y si le sirve a alguien con o sin modificaciones que lo utilice y sino pues nada.
Gracias por las indicaciones, de todas maneras como esto es una afición, cuando me da errores algun programa (lo que sucede a menudo) lo intento corregir o lo escribo de otra manera.

Con un último rm "$temporal" se borra el último archivo temporal.

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

En el ejemplo mandado, esta linea
echo "$OLDPWD"/"`cat $archivo`" # esto solo muestra el contenido
simplemente muestra un nombre de archivo, teniendo ese nombre en esta parte el usuario puede
hacer con el archivo lo que quiera, filtrarlo, borrarlo, supongo que para eliminar los brackets seria algo asi
t=`tempfile`
cat "`cat ../$archivo`" | tr -d "[" | tr -d "]" > $t
mv $t "/$archivo"
Gracias por los comentarios.
Supongo que se puede hacer de muchas otras maneras

+1
0
-1
Imagen de pwned
+1
0
-1

Claro amigo coder, yo soy un mero aficionado, pero cuando publico un code lo reviso mil y una veces para ver que no tenga errores y cumpla con lo especificado, por eso no me gusta ver códigos con errores llamemosles "obvios".
Ademas, lo que dije de no usar los for con `cmd` que impliquen ficheros, no es una mania mia ni me lo he inventado, en todos los libros que se precien lo dice, y es una realidad como ya vió en la ejecución de su código.
Pero a pesar de que se lo dije (informativamente, sin animo de ofender), veo que en el 2º código lo vuelve a usar, luego lo veo por su parte como un mero acto de cabezoneria y creo que el rechazar consejos no es la mejor opción.

+1
0
-1