Как я могу превратить эти инструкции в цикл?

n in: noremap предназначен для обычного режима, поэтому он не будет работать в режиме вставки. Если вы хотите, чтобы он работал в режиме вставки, используйте: imap. Если вы пытались использовать , чтобы заставить его работать в режиме вставки, я думаю, вы искали .

0
28.01.2019, 23:26
2 ответа

Мне в голову не приходит, что ты делаешь что-то подобное:

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

1
28.01.2020, 02:30
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
1
28.01.2020, 02:30

Теги

Похожие вопросы