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
использования табуляции в качестве разделителя полей в выходных данных). Нет необходимости проходить через разные инструменты и иметь временные файлы, просто извлеките третье поле, добавьте еще две строки и замените новые строки табуляциями.