Оптимизированное отдельное -обработанное GNU Awk решение:
awk 'BEGIN{ PROCINFO["sorted_in"]="@ind_str_asc" }
{ a[$NF]=$0 }END{ for(i in a) print a[i] }' unsortedNames.txt
PROCINFO["sorted_in"]="@ind_str_asc"
-сравнение/сортировка по ключам/индексам массива. Мы можем установить предопределенный массив PROCINFO
в одно из набора предопределенных значений. Эти специальные значения описаны здесь (документация):https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-ScanningВыход:
I M Board
Lenny R Graph
Faye King
Grey White
Я думаю, вы ищете это:
eval "echo $(cat file)"
eval создает команду, которая затем выполняется оболочкой.
Вы просто используете не тот инструмент для работы:
[user@host dir]$ ksh
$ echo "{1..4}" > file
$ cat file
{1..4}
$ echo $(<file)
1 2 3 4
$ echo $(cat file)
1 2 3 4
Шутки в сторону, порядок расширений в Bash такой:
Таким образом, в echo $(cat file)
выходные данные подстановки команды (без кавычек )подвергаются только разбиению на слова и расширению имени файла, оставаясь неизменными, поскольку не включают символы сопоставления с образцом (и предполагают, что ваш IFS
переменная не включает {
, 1
, .
, 4
или}
).
Хотя некоторые расширения могут быть вложенными, результат расширения, как правило, не анализируется повторно на наличие символов, которые запускают раскрытия от этапов до текущего. (По уважительной причине :подумайте оfoo=\$foo; echo "$foo"
).
Чтобы расширение фигурных скобок применялось к содержимому file
, вам нужно построить новую командную строку и позволить оболочке проанализировать и выполнить ее. Один из способов eval
, как показано в этот другой ответ у вас есть. В качестве альтернативы вы можете использовать подстановку процесса:
$. <(printf '%s ' echo; cat file)
1 2 3 4
Обратите внимание, что в обоих случаях все содержимое file
будет проанализировано и выполнено в текущей среде.
Аналогично, но выполнение в отдельной среде нового bash
процесса:
$ bash <<<$( printf "%s " echo; cat file; )
1 2 3 4
Между прочим, ksh93 (оболочка, которую я использовал в своем первом блоке кода )ведет себя особым образом :раскрытие скобок выполняется на более позднем этапе, как часть разделения полей, и результат предыдущие расширения анализируются заново для обнаружения фигурных скобок 1:
$ bash -c 'echo {1..$(printf %s 3)}' mybash
{1..3}
$ ksh -c 'echo {1..$(printf %s 3)}' myksh
1 2 3
1Как заметил Stéphane Chazelas в комментариях , такое поведение ksh93 можно считать ошибкой и оно не соответствует POSIX.так как это позволяет $var
не расширяться до значения var
.