Если мы не заботимся о выравнивании столбцов и просто хотим нормализованные данные, разделенные пробелами, основной шаблон следующий:
awk -F' +' '{ $1 = ($1 ~ /^$/ ? prev : $1); prev = $1; print }'
Видите ли, если мы настроим настраиваемый разделитель полей, который не равен пробелу по умолчанию, добиваемся истинного разделения полей. Если запись начинается с совпадения разделителя, то пустое поле разделяется.
По умолчанию Awk не разделяется; он токенизирует: он извлекает из каждой записи токены, которые представляют собой последовательности одного или нескольких непустых / непустых символов. Это означает, что начальные и конечные пробелы / новые строки игнорируются. Таким образом, если у вас отсутствует столбец 1, значение в столбце 2 становится столбцом 1.
С нашим регулярным выражением разделителя / + /
мы получаем истинное поведение разделения.Запись с начальным и конечным пробелами, например 1 2 3 4
, обрабатывается как
. Таким образом, имеется шесть полей: ""
, "1"
, ..., "4"
, ""
. Перед первым
и после последнего есть поле.
Кстати, если в первой записи может отсутствовать поле, нам, очевидно, потребуется значение по умолчанию для prev
. Мы также не хотим, чтобы эта логика применялась к заголовкам. Также давайте заменим тернарный оператор на if
: Таким образом:
awk 'BEGIN { FS = " +"; prev = 0 }
NR == 1
NR > 1 { if ($1 == "") $1 = prev
print
prev = $1 }'
FOO BAR BAZ
FOO BAR BAZ
2 3 4
0 2 3 4
1 2 3 4
1 2 3 4
2 3 4
1 2 3 4