Cómo solucionar el problema con la mitad de los resultados de salida

Cómo solucionar el problema con la mitad de los resultados de salida
for f in 20*.txt
    do
    sed -n '1p' "$f" | cut -d' ' -f3 >> displayStudentInfo.txt
    head -3 "$f" | tail -2 >> displayStudentInfo.txt
    done
    cat displayStudentInfo.txt
    rm displayStudentInfo.txt
    printf "\n"

Cuando uso este código, me da la mitad de lo que hay dentro del archivo, pero si lo intento catpuedo ver todos los resultados. Además, ¿cómo puedo enumerar todos los archivos en una línea en lugar de tener las 3 primeras líneas?

Por ejemplo:

ID
Name
Grade

En su lugar, quiero poner todo en una fila:

ID Name Grade

Si uso este código head displayStudentInfo.txt me da la mitad de lo que hay dentro del archivo:

201700128
GPA: 3.2
Major: Pharmacy
201703451
GPA: 2.2
Major: Political Science
201759284
GPA: 3.4
Major: Marketing
201800082

se supone que son 9 estudiantes diferentes y no sé cómo poner la identificación, la especialización y el GPA en una línea.

Respuesta1

Resolvió su tarea, pero dejó abierta una pregunta que nadie puede responder sin la información requerida. Este sitio sirve como un archivo para otras personas que buscan una respuesta a sus problemas, por lo que es molesto dejar preguntas abiertas como esta.

Aprovecho para demostrar las debilidades de su intento. Por ejemplo, mezclas herramientas sin ventaja:

sed -n '1p' "$f" | cut -d' ' -f3 >> displayStudentInfo.txt
head -3 "$f" | tail -2 >> displayStudentInfo.txt

La primera línea muestra que sabes cómo usar sedpara obtener ciertas líneas, entonces, ¿por qué usas esa combinación torpe y difícil de leer de heady tailen la segunda línea? Obviamente sed -n '2p;3p'haría el mismo trabajo. O puede escribir sed '2,3!d'para eliminar todos los Me gusta excepto el rango de la línea 2 a la 3.

Por supuesto, sedtambién puede extraer el tercer campo de la primera línea como sed -E '1!d;s/([^ ]* ){2}//;s/ .*//'(eliminar los primeros 2 campos y luego todo lo que está detrás del primer campo), lo cual no es una simplificación en este punto, pero lo hará más fácil si desea combinar las tres partes. a una línea e incluso deshacerse del forbucle:

sed -sE '1!d;s/([^ ]* ){2}//;s/ .*//;N;N;s/\n/\t/g' 20*.txt

sed( Sintaxis GNU con opción -spara tratar archivos por separado y \tusar una pestaña como separador de campos en la salida). No es necesario utilizar diferentes herramientas y tener archivos temporales, simplemente extraiga el tercer campo, agregue dos líneas más y reemplace las nuevas líneas con pestañas.

información relacionada