2016-03-30 10 views
1

У меня возникла проблема с 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 я могу сделать последовательность, но я желаю элегантный способ сделать это в файле.

ответ

3

Вы можете использовать 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 

Объяснение:

  • - совпадают только линии с 2-х или 3-х цифр.
  • j = (NF==3) ? $2 : 1 - установить переменную j в $2, если есть 3 колонков в противном случае установить j к 1
  • for(i=$1; i<=$NF; i+=j) перспективы петлю с 1-го седловины к последней седловине, приращения по j
  • sprintf используются для форматирования сгенерированной последовательности
  • 1 это действие по умолчанию AWK для печати каждой строки
+1

обычай может быть любой строки, возможно, также '1 странная строка'. Непонятно из этого вопроса, для решения прямой задачи. –

+0

Это не сработало. Может быть, я должен был быть более ясным, любая строка может соответствовать обычаю, и буквально будет строка «custom», другие строки могут иметь 2 или 3 числа, и это может быть любое число в строке, я проверяю этот код для файла что составило 2 2 10; обычай; 2 6 10; обычай; 1 5 (; представить строку), обратите внимание, что для выхода 2 6 10 должно быть 2 6 - я буквально хочу выполнить команду seq на любой строке, которая не равна таможне –

+0

Если это помогает, файл может иметь 1, 2 или 3 линий. Я не упоминал об этом, потому что я хотел получить более общее решение. так как максимальное количество строк в файле равно 3, я могу решить эту проблему вручную с помощью многого, если else операторов, которые будут обрабатывать все 8 случаев, но я надеялся на более элегантное решение. –

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^