n in: noremap предназначен для обычного режима, поэтому он не будет работать в режиме вставки. Если вы хотите, чтобы он работал в режиме вставки, используйте: imap. Если вы пытались использовать
Мне в голову не приходит, что ты делаешь что-то подобное:
# loop over all files in the student directory
for studentfile in /home/student/*; do
# take just the name of the student (the file name without the path)
studentname="${studentfile##*/}"
# uncomment the next line to clear the student files before populating them
# > "$studentfile"
# loop over all subject files
for subject in /home/subject/*; do
# again, remove the path
subject="${subject##*/}"
grep "$studentname" "$subject" | cut -d' ' -f2 >> "$studentfile"
done
done
Это предполагает, что имена файлов для студентов и предметов точно такие же, как метки, используемые для них в файлах, и что для каждого студента уже существует файл.
Расширение ${var##*/}
принимает значение $var
с удалением самого длинного префикса, соответствующего */
, т. е. оставляет только путь. Нам нужны оба для студента, так как мы используем только Matthew
для grep
, но /home/student/Matthew
для перенаправления вывода.
Обратите внимание, что в вашем назначении Geo_Matthew=$(grep "Matthew" "$GEOGRAPHY" | cut -d' ' -f2) > "$studentMatthew"
есть дополнительное перенаправление, присваивание не создает никаких выходных данных, поэтому перенаправление только обрезает файл, указанный в $studentMatthew
. Вы можете просто перенаправить вывод grep
в файл и удалить подстановку команд, переменную Geo_Matthew
и более позднюю echo
.
Это было бы лучше сделать с помощью сценария awk или Perl, а не сценария оболочки, но приведенный выше возможный способ упорядочить имеющиеся у вас команды в циклах.
for subjfile in /home/subject/*; do
awk -v subj="$(basename "$subjfile")" '{ print subj, $2 >>"/home/student/" $1 }' "$subjfile"
done
Это приведет к перебору всех тематических файлов. Значение $subjfile
будет примерно таким, как /home/subject/Math
или /home/subject/Geography
и т. д., в зависимости от доступных предметов.
Программа awk
будет открывать каждый из этих файлов по очереди и печатать имя субъекта (, которое является «базовым именем» пути в $subjfile
, т.е. Math
или Geography
), за которым следует отметка в этой теме (столбец 2 файла $subjfile
).
Это будет записано в "/home/student/" $1
, который является путем под /home/student
. $1
— это первый столбец файла $subjfile
, который является именем учащегося.
В коде предполагается, что каталог student
пуст при запуске скрипта (или он будет присоединяться к файлам в нем ).
Работа с заданными данными (, включая неправильное написание одного из имен ),это создаст три файла в/home/student
:
$ cat Elena
Geography 14
Math 19
$ cat Mattew
Geography 15
$ cat Matthew
Math 10
Обратите внимание, что имена учащихся выбираются из файлов в разделе /home/subject
и никогда не жестко -кодируются в сценарии. Кроме того, различные темы зависят от того, какие файлы доступны в каталоге /home/subject
.
Хотели бы вы сделать это без привлеченияawk
:
for subjfile in /home/subject/*; do
subject=$( basename "$subjfile" )
while read -r name marks; do
printf '%s %d\n' "$subject" "$marks" >>"/home/student/$name"
done <"$subjfile"
done