Как упорядочить строки в файлах, если некоторые строки являются строками

Я столкнулся с проблемой с Bash, я начал использовать его недавно. Я понимаю, что много волшебных вещей можно сделать всего одной строкой, так как мой предыдущий вопрос был решен этим. На этот раз вопрос прост:

У меня есть файл, который имеет этот формат

2 2 10
custom
8 10
3 5 18
custom
1 5

некоторые строки равны строке custom (это может быть любая строка!), а в других строках 2 или 3 числа. Я хочу файл, который будет последовательность строки с числами, но сохранить строки с пользовательским (порядок также должен быть одинаковым), поэтому желаемый результат

2 4 6 8 10
custom
8 9 10
3 8 13 18
custom
1 2 3 4 5

Я также хочу перезаписать входной файл этим. Я знаю, что с помощью seq я могу выполнить секвенирование, но я хочу элегантный способ сделать это в файле.

2 ответа

Решение

Вы можете использовать awk следующим образом:

awk '/^([[:blank:]]*[[:digit:]]+){2,3}[[:blank:]]*$/ {
   j = (NF==3) ? $2 : 1
   s=""
   for(i=$1; i<=$NF; i+=j)
      s = sprintf("%s%s%s", s, (i==$1)?"":OFS, i)
   $0=s
} 1' file

2 4 6 8 10
custom
8 9 10
3 8 13 18
custom
1 2 3 4 5

Объяснение:

  • /^([[:blank:]]*[[:digit:]]+){2,3}[[:blank:]]*$/ - сопоставлять только строки с 2 или 3 числами.
  • j = (NF==3) ? $2 : 1 - установить переменную j в $2 если установлено 3 столбца j в 1
  • for(i=$1; i<=$NF; i+=j) выполнить цикл от 1-го столбца до последнего столбца, увеличивая на j
  • sprintf используется для форматирования сгенерированной последовательности
  • 1 по умолчанию действие awk для печати каждой строки

Это может работать для вас (GNU sed, seq и paste):

sed '/^[0-9]/s/.*/seq & | paste -sd\\  /e' file

Если строка начинается с цифры, используйте значения строк в качестве параметров для команды seq, которая затем передается по команде вставки. RHS команды замены оценивается с использованием e флаг (специфичный для GNU sed).

Другие вопросы по тегам