Перекомпилируйте ядро ​​без модулей, которые в настоящее время не используются.

Если мы не заботимся о выравнивании столбцов и просто хотим нормализованные данные, разделенные пробелами, основной шаблон следующий:

awk -F' +' '{ $1 = ($1 ~ /^$/ ? prev : $1); prev = $1; print }'

Видите ли, если мы настроим настраиваемый разделитель полей, который не равен пробелу по умолчанию, добиваемся истинного разделения полей. Если запись начинается с совпадения разделителя, то пустое поле разделяется.

По умолчанию Awk не разделяется; он токенизирует: он извлекает из каждой записи токены, которые представляют собой последовательности одного или нескольких непустых / непустых символов. Это означает, что начальные и конечные пробелы / новые строки игнорируются. Таким образом, если у вас отсутствует столбец 1, значение в столбце 2 становится столбцом 1.

С нашим регулярным выражением разделителя / + / мы получаем истинное поведение разделения.Запись с начальным и конечным пробелами, например 1 2 3 4 , обрабатывается как 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
3
28.07.2015, 16:22
0 ответов

Теги

Похожие вопросы