Как упорядочить строки в файлах, если некоторые строки являются строками
Я столкнулся с проблемой с 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).