Как работает сортировка строк по длине на чистом awk и Conditional Expression Operator
Есть код позволяющий отсортировать строки в чистом awk при этом строки одинаковой длины не затрут друг друга а будут выведены друг за другом:
{
c = length
m[c] = m[c] ? m[c] RS $0 : $0
}
END {
for (c in m) print m[c]
}
Я понимаю что в массив m
заносятся строки где индекс элемента это длина строки а содержимое элемента сама строка. Но что делает строка m[c] = m[c] ? m[c] RS $0 : $0
? Если в элемент присваивается такая же строка (или другая строка с такой же длиной?) то элемент массива разделитель строки вся строка иначе вся строка? Что это вообще такое, как это работает?
Я скачал учебник и там написано
Conditional Expression Operator.
A conditional expression has the form
expr 1 ? expr2 : expr 3
First, expr1 is evaluated. If it is true, that is, nonzero or nonnull, the value of the conditional expression is the value of expr 2 ; otherwise, it is the value of expr 3 . Only one of expr 2 and expr3 is evaluated.
Evaluated это вычислено? Что здесь вычисляется/сравнивается? Операция присвоения m[c] = m[c]
это вычисление? Что она вычисляет? Это можно заменить конструкцией if-then-else? Как работает m[c] RS $0
? Что оно вычисляет?
Мне не хватает рейтинга чтобы спросить у автора, да и вряд ли он будет отвечать на такой давний вопрос.
Ответы (1 шт):
Если на пальцах:
Присвоение m[c]=
(обновление набора строк одной длины) выполняется после выполнения правой части, обрабатывающей очередную запись(строку) $0
В правой части производится склейка строк одной длины через разделитель RS
Если набор строк длиной с
ещё пустой (проверка m[c]?
), то в него запишется строка ($0
).
Если в нём уже что-то есть, то эта строка добавится через разделитель m[c] RS $0
Нечто похожее на Python без использования тернарного оператора:
a = ['abc', 'sd', 'rew', 'qsdf', 'ab']
m = {}
for s in a:
с = len(s)
if с in m.keys():
m[с] = m[с] + '\n' + s
else:
m[с] = s
for ky in sorted(m.keys()):
print(m[ky])
sd
ab
abc
rew
qsdf