Это расширение моего предыдущего вопроса ( Шаблон печати символа «C» ).
Я хотел бы напечатать символ «C» из столбца «text», указанного в file.csv. Файл.csv содержит два столбца в виде идентификатора и текста.
Мне нужно отредактировать расстояния между ними, а также начало символа, например, следуя
Поэтому, когда в столбце «текст», печатается расстояние между двумя символами С, например, если столбец «текст» имеет значение DCFRCGHCCRF, то в третьем столбце следует вывести 1C2C2CC2
пример ввода
c32_g1_i1_3,SCIPKHEECTNDKHNCCRKGLFKLKCQCSTFDDESGQPTERCACGRPMGHQAIETGLNIFRGLFKGKKKNKKTKG
c32_g1_i1_6,ACAERKKKCTKDDDCSCCGKWDKCSCNWPGREGCFCMRGMMATRLWKMAKC
пример вывода
c32_g1_i1_3,SCIPKHEECTNDKHNCCRKGLFKLKCQCSTFDDESGQPTERCACGRPMGHQAIETGLNIFRGLFKGKKKNKKTKG,1c6c6cc8c1c13c1c31
c32_g1_i1_6,ACAERKKKCTKDDDCSCCGKWDKCSCNWPGREGCFCMRGMMATRLWKMAKC,1c6c5c1cc5c1c7c1c14c0
Как насчет чего-то вроде этого
perl -F, -alne '
my @a = split "C", @F[1];
my @b = (map { $_ ? length $_ : "" } @a);
print join ",", (@F, join "c", @b)
' file.csv
c32_g1_i1_3,SCIPKHEECTNDKHNCCRKGLFKLKCQCSTFDDESGQPTERCACGRPMGHQAIETGLNIFRGLFKGKKKNKKTKG,1c6c6cc8c1c13c1c31
c32_g1_i1_6,ACAERKKKCTKDDDCSCCGKWDKCSCNWPGREGCFCMRGMMATRLWKMAKC,1c6c5c1cc5c1c7c1c14
Или более сжато
perl -F, -alne '
print join ",", (@F, join "c", (map { $_ ? length $_ : "" } split "C", @F[1]))
' file.csv
Получить желаемое поведение, когда существует запаздывание C
во входе необходимо изменить split
команда с явным LIMIT
параметр, как отмечено - несколько непрозрачно - в разделении () perldoc:
Пустые запаздывающие поля, с другой стороны, производятся, когда существует соответствие в конце строки (и когда ПРЕДЕЛ дан и не 0), независимо от продолжительности соответствия.
Таким образом, выражение становится
$ perl -F, -alne '
print join ",", (@F, join "c", (map { $_ ? length $_ : "" } split "C", @F[1], -1))
' file.csv
c32_g1_i1_3,SCIPKHEECTNDKHNCCRKGLFKLKCQCSTFDDESGQPTERCACGRPMGHQAIETGLNIFRGLFKGKKKNKKTKG,1c6c6cc8c1c13c1c31
c32_g1_i1_6,ACAERKKKCTKDDDCSCCGKWDKCSCNWPGREGCFCMRGMMATRLWKMAKC,1c6c5c1cc5c1c7c1c14c
(вдохновение для map
взятый от самого быстрого [так] способ удалить элементы пустого массива)