Как работает сортировка строк по длине на чистом 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 шт):

Автор решения: MBo

Если на пальцах:

Присвоение 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
→ Ссылка