
Hola, actualmente estoy intentando ejecutar el siguiente código. He almacenado una cadena dentro de la variable FECHA que tiene el formato AAAA/MM/DD. Estoy intentando extraer el año usando el comando cortar. Recibo un error que indica que no es un archivo o directorio. ¿Hay alguna modificación que pueda hacer o alguna forma diferente de hacerlo?
for file in ~/filesToSort/*
do
DATE=$(head -1 $file | tr "-" "/")
echo "${DATE}"
YYYY=$(cut -c1-4 accounts $DATE)
#echo "${YYYY}"
done
Gracias
Respuesta1
La cut
utilidad lee datos de su flujo de entrada estándar, no opera con cadenas dadas como argumentos.
Por lo tanto, para utilizar cut
, debe pasar los datos en la entrada estándar:
YYYY=$( printf '%s\n' "$DATE" | cut -d '/' -f 1 )
Sin embargo, eso sería muy lento en un bucle. En su lugar, utilice una sustitución de parámetros incorporada para eliminar todo lo que sigue al primero /
de la $DATE
cadena:
YYYY=${DATE%%/*}
Esto elimina la cadena de sufijo más larga $DATE
que coincida con el patrón de shell /*
. Si la cadena es 2021/10/21
, entonces esto devuelve 2021
.
Para obtener los primeros cuatro caracteres de cada archivo en un directorio (que es la esencia de lo quecreersu código actual está intentando hacer), podría usar sed
así:
for name in "$HOME"/filesToSort/*; do
sed -e 's/\(....\).*/\1/' -e q "$name"
done
Esto lee la primera línea de cada archivo, reemplaza el contenido de la línea con los primeros cuatro caracteres de la línea y luego sale después de enviar el resultado a la terminal.
Respuesta2
Si su shell lo admite, puede usar Here Strings ( <<<
) para esto. De man bash
:
Here Strings
A variant of here documents, the format is:
[n]<<<word
The word undergoes tilde expansion, parameter and variable expansion,
command substitution, arithmetic expansion, and quote removal. Path‐
name expansion and word splitting are not performed. The result is
supplied as a single string, with a newline appended, to the command
on its standard input (or file descriptor n if n is specified).
En tu caso harías:
for file in ~/filesToSort/*
do
date=$(head -1 "$file" | tr "-" "/")
echo "${DATE}"
yyy=$(cut -c1-4 <<< "$date")
echo "$yyy"
done
Respuesta3
Otra forma más de utilizar el buen oleawk
for file in *; do
awk -F'-' 'NR==1 {print $1}' $file
done
-F '-'
le dice a awk que use-
como delimitadorNR==1
decirle a awk que lea solo la primera línea de cada archivo{print $1}
imprimir solo el primer campo separado por el delimitador