1

У меня есть вопрос, который касается языка сценариев bash.

У меня есть несколько каталогов

  • /studentName
  • /studentMail
  • /studentNumber

В каждом из этих каталогов есть файлы name.txt , mail.txt , number.txt .

Теперь мне нужно создать функцию, которая будет делать то же самое, что и функция SELECT базы данных MySQL. Не нужно читать ни одной строки. Просто отобразите все содержимое этих 3 файлов и отсортируйте их. что означает, что мне нужно что-то подобное в качестве вывода.

studentname | studentmail | studentnumber

Я придумал 2 способа.

первый:

cat /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt > summary
cat summary

Это покажет все содержимое 3 файлов друг под другом, что, очевидно, не хорошо.

Я также придумал это:

paste /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt

Это действительно отображает все содержимое, но все еще не отсортировано. И позже мне нужно будет выбрать только 1 строку для отображения.

Кто-нибудь может мне помочь сделать это?

PS: я знаю о sort , но тогда все содержимое отображается друг под другом, как-то я не правильно делаю?

2 ответа2

2

Как файлы сортируются сейчас? Скажем, строка 3 всех трех файлов относится к одному и тому же ученику? Если это так, вы можете расширить свой раствор paste до этого:

paste /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt | sort

что бы отсортировать все записи (строки) по имени студента. Вы можете отсортировать по другому полю, используя соответствующие параметры для sort .

Чтобы выбрать одну строку для отображения, следуйте любой команде, которая дает правильно отсортированный список с помощью grep , например:

paste ... | sort | grep 'pattern'

где 'pattern' будет вашим критерием поиска в форме регулярного выражения. Конечно, если вы выбираете только одну строку, sort не требуется.

Другая команда, которую вы можете найти полезной, - это join , но я недостаточно знаю об этом, чтобы дать вам пример ее использования.

Обновление: форматирование с помощью awk

Вывод команды paste выше представляет собой последовательность строк, каждая строка состоит из трех полей, отделенных друг от друга вкладками, т. Е.

<Field1> <вкладка> <field2> <вкладка> <field3>

Эти строки можно отформатировать, добавив их в следующую команду awk .

awk -F '\t' '{printf "%-20s%-16s%s\n", $1, $2, $3}'

Аргумент -F '\t' указывает, что разделитель поля ввода является символом табуляции. Это разделит входные строки на три поля, на которые awk ссылается на $1 , $2 и $3 . Язык awk включает в себя функцию printf которая ведет себя практически так же, как функция printf() библиотеки C. Приведенная выше строка формата определяет три строковых поля. Первый, %-20s , указывает, что соответствующий строковый параметр должен быть выровнен по левому краю в поле из 20 символов. Второй, %-16s , указывает, что его параметр должен быть выровнен по левому краю в поле из 16 символов. Последний, %s , просто добавляет свой параметр к тому, что уже было отформатировано. Наконец, \n ставит новую строку в конце, чтобы каждая строка ввода форматировалась в отдельную строку вывода.

Чтобы настроить вывод на свой вкус, просто измените ширину поля и / или удалите знаки минус, чтобы выровнять строки по правому краю. Дополнительные параметры см. На страницах руководства awk и printf .

1

если вы хотите отсортировать каждый файл, вставьте отсортированные данные, используя bash, вы можете использовать процесс подстановки:

paste -d '|' <(sort file1) <(sort file2) <(sort file3)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .