У меня есть файл под названием «krylov_methods», который имеет такой текст:
cg - preconditioned
cgne - normal equations
nash - cg subject to constraint
stcg - another method for constraints
gmres - general minimum residual
...
Мне нужно извлечь первое слово (строку символов) каждой строки, один за другим, в оболочку скрипт и использовать его в качестве аргумента командной строки в этом скрипте. Чтобы извлечь первое слово, я использовал следующую команду:
head -1 krylov_methods | tail -1 | awk '{print $1}'
head -2 krylov_methods | tail -1 | awk '{print $1}'
head -3 krylov_methods | tail -1 | awk '{print $1}'
...
Кажется, что это хорошо работает для извлечения первого слова каждой строки по одному. Однако мне нужно иметь возможность хранить строку символов как переменную для будущего использования в скрипте. Например, поскольку первым словом первой строки файла «krylov_methods» является слово «cg», я хочу иметь возможность хранить «cg» для переменной «метод». Внутри скрипта я хотел бы получить что-то вроде:
method=cg
./execute $method
Возможно ли сохранить результат команды «head», используемой в сценарии оболочки?
Собственно, после некоторых экспериментов я понял:
method=$(head -$i krylov_methods | tail -1 | awk '{print $1}')
execute $method
Нет необходимости использовать оба head и tail. AWK может печатать строку, о которой вы говорите, довольно легко
$> awk -v LINE=5 'NR==LINE' /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync
Вы можете превратить это в функцию в свой скрипт bash (не забудьте указать полный или частичный путь к файлу, если он имеет пробелы или специальные символы):
print_line_number() {
awk -v LINE="$1" "NR==LINE" "$2"
}
И здесь он находится в действии
$> print_line_number 5 /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync