Как исправить проблему с половиной результатов вывода

Как исправить проблему с половиной результатов вывода
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"

Когда я использую этот код, он дает мне половину того, что находится внутри файла, но если я попробую, catто смогу полностью увидеть свои результаты. Кроме того, как мне перечислить каждый файл в одной строке вместо того, чтобы иметь 3 первых строки?

Например:

ID
Name
Grade

Вместо этого я хочу расставить все по порядку:

ID Name Grade

Если я использую этот код, head displayStudentInfo.txt он даст мне половину того, что находится внутри файла:

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

Предполагается, что это будут 9 разных студентов, и я не знаю, как указать идентификатор, специальность и средний балл в одной строке.

решение1

Вы решили свою задачу, но вы оставили открытым вопрос, на который никто не может ответить без необходимой информации. Этот сайт служит архивом для других, ищущих ответ на свои проблемы, поэтому раздражает оставлять открытыми такие вопросы.

Я пользуюсь случаем, чтобы продемонстрировать слабость вашей попытки. Например, вы смешиваете инструменты без преимущества:

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

Первая строка показывает, что вы знаете, как использовать sedдля получения определенных строк, так почему вы используете эту неуклюжую и трудночитаемую комбинацию headи tailво второй строке? Очевидно, sed -n '2p;3p'что это сделает то же самое. Или вы могли бы написать, sed '2,3!d'чтобы удалить все лайки, кроме диапазона от строки 2 до 3.

Конечно, sedможно также извлечь третье поле первой строки следующим образом sed -E '1!d;s/([^ ]* ){2}//;s/ .*//'(удалить первые 2 поля, а затем все, что находится после первого поля), что на данном этапе не является упрощением, но облегчит задачу, если вы захотите объединить все три части в одну строку и даже избавиться от цикла for:

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

sed( Синтаксис GNU с возможностью -sраздельной обработки файлов и \tиспользования табуляции в качестве разделителя полей в выходных данных). Нет необходимости проходить через разные инструменты и иметь временные файлы, просто извлеките третье поле, добавьте еще две строки и замените новые строки табуляциями.

Связанный контент