печать расстояний нужного символа на основе появления

Это расширение моего предыдущего вопроса ( Шаблон печати символа «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
0
задан 13 April 2017 в 15:23

1 ответ

Как насчет чего-то вроде этого

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 взятый от самого быстрого [так] способ удалить элементы пустого массива)

1
ответ дан 14 April 2017 в 01:23
  • 1
    Я должен был сначала сделать, sudo склонный - добираются - чистка удаляет cuda, и sudo склонный автоудаляют, чтобы удалить Cuda 9. Тогда я установил Cuda 8 – Abhijay Ghildyal 28 November 2017 в 08:40

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

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