La idea de mi bucle es imprimir el primer dígito de cada línea de un archivo. El archivo es este:
256-56-8411 Bob 3.61 Junior CS
471-44-7458 Tim 3.45 Senior CE
326-56-4286 Rajesh 2.97 Freshman TE
548-66-1124 Eric 2.88 Sophomore EE
447-21-3599 John 2.51 Junior CS
911-41-1256 Rebecca 3.92 Senior CS
854-22-6372 Robin 2.45 Freshman TE
Y el resultado después de ejecutar el script es:
This is a script that analyses student data from input file students.txt
----------------------------------------------------------------------
./student_script: line 8: 2
4
3
5
4
9
8: No such file or directory
7 is the number of students in the input file.
Y por último, el código es:
echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount=`wc -l < $1 `
tempFile=`cut -c1 $1`
while read n
do
echo "$n"
done < $tempFile
echo "$studentCount is the number of students in the input file."
Después de solucionar este problema, planeo usar el bucle while para verificar si el primer dígito es un cuatro o no y luego indicar cuántos ID (primera columna) no comienzan con un 4.
No me importa aprender sobre una solución más limpia que mi enfoque, pero esto es para una clase y no creo que hayamos aprendido mucho. Durante mi viaje vi muchas cosas similares con awk, pero aún no hemos aprendido nada de awk.
Pero sí, básicamente obtuve todos los datos que quería de mi bucle, excepto que agregó esos dos bits adicionales.
Respuesta1
Lo que escribiste en esta línea:
tempFile=`cut -c1 $1`
no crea un archivo llamado tempFile
. Por lo tanto no puedes leerlo.
Puede cambiar esa línea a:
cut -c1 "$1" > tempFile
tempFile
Y se creará un archivo llamado para que el while read
bucle lo lea. No lo use $tempFile
en ese bucle, ya que la variable $tempfile
es nula (no existe). Utilice algo como (sin $):
done < tempFile
Sin embargo, el comando simple cut -c1 "$1"
escribirá todos los primeros caracteres del archivo fuente, simplemente ejecute esto para verlo:
cut -c1 "sourcefile"
Sabiendo eso, no necesita un archivo temporal para contener los valores, solo use un documento aquí.
Usando un documento aquí y limpiando algunos otros problemas en su script:
#!/bin/sh
echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount="$(wc -l < "$1" )"
while read n
do
echo "$n"
done <<-_avoid_a_file_
$(cut -c1 "$1")
_avoid_a_file_
echo "$studentCount is the number of students in the input file."
Es una buena práctica utilizar un she-bang (#!) para indicar qué intérprete debe ejecutar el código. En este caso supuse que querías sh
por la mención de Bourne shell
. Tenga en cuenta que el shell Bourne original es bastante antiguo (~1979) y que se han agregado muchas mejoras a los shells más recientes (ksh, bash, mksh, zsh, etc.).