Como corrigir o problema com resultados de metade das saídas

Como corrigir o problema com resultados de metade das saídas
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"

Quando uso esse código, ele me dá metade do que está dentro do arquivo, mas se eu tentar, catposso ver meus resultados por completo. Além disso, como posso listar todos os arquivos em uma linha em vez de ter as três primeiras linhas?

Por exemplo:

ID
Name
Grade

Quero colocar tudo em uma linha:

ID Name Grade

Se eu usar este código, head displayStudentInfo.txt ele me dará metade do que está dentro do arquivo:

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

deveriam ser 9 alunos diferentes e não sei como colocar id, especialização e GPA em uma linha.

Responder1

Você resolveu sua tarefa, mas deixou em aberto uma pergunta que ninguém pode responder sem as informações necessárias. Este site serve como um arquivo para outras pessoas que procuram uma resposta para seus problemas, então é chato deixar perguntas em aberto como esta.

Aproveito para demonstrar a fraqueza de sua tentativa. Por exemplo, você mistura ferramentas sem vantagem:

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

A primeira linha mostra que você sabe como usar sedpara obter certas linhas, então por que você usa aquela combinação desajeitada e difícil de ler de heade tailna segunda linha? Obviamente sed -n '2p;3p'faria o mesmo trabalho. Ou você pode escrever sed '2,3!d'para excluir todas as curtidas, exceto o intervalo da linha 2 a 3.

Claro, sedtambém é possível extrair o terceiro campo da primeira linha como sed -E '1!d;s/([^ ]* ){2}//;s/ .*//'(remover os 2 primeiros campos e depois tudo atrás do primeiro campo), o que não é nenhuma simplificação neste ponto, mas facilitará se você quiser combinar todas as três partes para uma linha e até mesmo se livrar do forloop:

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

sed( Sintaxe GNU com opção -sde tratar arquivos separadamente e \tde usar uma aba como separador de campos na saída). Não há necessidade de percorrer diferentes ferramentas e ter arquivos temporários, simplesmente extrair o terceiro campo, anexar mais duas linhas e substituir as novas linhas por tabulações.

informação relacionada