Как я мог легко расширить список номеров с дефисами, заменяющими повторные детали?

2 ответа

Пробовал с awk:

cat file | awk -F ', ' '{ print $1; for(a=2;a <= NF; a ++){printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2)) } }'

Выход:

33520470
33520850
33520860
33520870
33520880
33520890
25453810
13340820
61040146
61040155
60819060
60819079
60819088

Редактировать:

Код для получения правильного результата:

cat file | awk -F ', ' '{ print $1; for(a=2;a <= NF; a ++){ if(length($a) <= 3){ printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2))} else { print $a } } }'

Результат:

33520470
33520850
33520860
33520870
33520880
33520890
33630077
25453810
13815206
13815207
13815208
60682651
60709994
13340820
61040146
61040155
60819060
60819079
60819088
1
28.01.2020, 02:41

Обновлен с шагом предварительной -обработки для обработки измененного ввода.

Остальная часть этого ответа предполагает, что данные были предварительно -обработаны с помощью

grep -oE '[0-9]{8}(, -[0-9]+)*'

То есть полное решение потребует

grep -oE... file | awk...

BEGIN { FS = ", *" }

{
    print $1
    for (i = 2; i <= NF; ++i)
        print substr($1, 1, length($1) - length($i) + 1) substr($i, 2)
}

Этот awkскрипт читает строку, а затем печатает первое поле, разделенное запятыми -. Затем он перебирает оставшиеся поля и выводит первое поле с обрезанными в конце символами, достаточными для вставки символов после -в другие поля.

Код допускает «суффиксы» переменной длины.

Тестирование:

$ awk -f script.awk file
33520470
33520850
33520860
33520870
33520880
33520890
25453810
13340820
61040146
61040155
60819060
60819079
60819088

Другой пример:

$ cat file
1111
2222,-3,-4, -33,-44, -333,-444
$ awk -f script.awk file
1111
2222
2223
2224
2233
2244
2333
2444

Как «один -лайнер»:

awk -F ', *' '{print $1; for(i=2;i<=NF;++i)print substr($1,1,length($1)-length($i)+1)substr($i,2)}' file
0
28.01.2020, 02:41

Теги

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