Ого, кто бы это ни написал, он должен был заплатить по линии.
Блок кода, который встречается дважды, от len = length(line)
до line = substr(line,1,newlen-1)
, выполняет преобразование строки, которое может быть просто (и более четко) выражено как замена регулярного выражения. Он рассчитывает количество |
символов в конце line
и удаляет их. Когда строка заканчивается символом, отличным от |
, один символ удаляется (это может быть случайным). Это может быть просто выполнено как gsub(/(\|+|.)$/, "", line)
или gsub(/\|+)$/, "", line)
, если поведение без окончательного |
не имеет значения.
Что касается общей структуры, в коде есть три части: что сделано для первой строки (if (NR == 1) {…}
, что сделано для других строк (else {…}
) и что сделано после последней строки (END {…}
) ). В первой строке переменная line
установлена на преобразование $0
. На последующих строках печатается сохраненный line
, затем line
устанавливается на текущую строку. Наконец, последняя строка печатается, преобразуется Этот шаблон print-previous-then-save-current является распространенным приемом, который действует по-разному в последней строке: когда вы читаете строку, вы не можете знать, последняя ли она, поэтому сохраняете ее, печатаете предыдущую строку. и двигаться дальше; в блоке END
вы делаете то же самое для последней строки.
Вот как бы я это написал. Поток данных аналогично нетривиален (но вряд ли надуманен), но, по крайней мере, он не утоплен в грязном преобразовании текста.
function cleanup (line) { gsub(/(\|+|.)$/, "", line); return line }
NR != 1 { print prev }
{ prev = (NR == 1 ? cleanup($0) : $0) }
END { print cleanup(prev) }