разделить строку с помощью разделителя и сохранить оба поля в другой переменной

разделить строку с помощью разделителя и сохранить оба поля в другой переменной

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

Theрезатькоманда разделяет весь файл, а не прочитанную строку.

Пример my_file.txt:

d1:jobid1
id2:jobid2

Я использую следующий цикл while для построчного чтения файла

while IFS= read -r line; do
    jobid=`cut -d: -f2`
    id=`cut -d: -f1`

#remaining shell-script dependent upon variables#

done < my_file.txt

Я хочу сохранить jobid и id для каждой строки my_file.txtи запустить завершающий скрипт.Каждая строка в новой строке.

Нужна помощь в сохранении значений в переменных рекурсивно. Если есть лучший способ читать построчно и разделять и хранить два поля отдельно.

решение1

cutпо умолчанию считывает из стандартного ввода. В вашей подстановке команд стандартный ввод наследуется от стандартного ввода цикла (поскольку вы не предоставляете никакого явного ввода для вызовов cut). Стандартный ввод цикла поступает из вашего входного файла.

Эффект заключается в том, что первая строка вашего файла считывается read, в то время как все остальные строки считываются самым первым вызовом cut. Таким образом, значение в jobidпеременной будет строкой идентификаторов заданий, разделенных новой строкой, в то время как idпеременная будет пустой. Цикл выполнит только одну итерацию.

Тымог бы использовать, например,

id=$( printf '%s\n' "$line" | cut -d: -f1 )

# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")

но это было бы ненужно, так как это было бы чище и гораздо эффективнее сделать

while IFS=: read -r id jobid; do
    # code that uses "$id" and "$jobid" goes here
done <my_file.txt

Здесь используется тот факт, что readможет считывать данные из строки ввода в несколько переменных одновременно. При установке IFSдвоеточия строка разделяется на двоеточии, и первое поле считывается в , idа остальное считывается в . Вызывать вообще jobidне нужно .cut

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