根据出现情况打印所需字符的距离

根据出现情况打印所需字符的距离

这是我上一个问题的延伸(“C”字印刷图案)。

我想从 file.csv 中给出的“文本”列中打印“C”字符。file.csv 有两列,分别是 ID 和文本。

我需要编辑角色之间的距离以及角色的起始位置,例如

因此,当在“文本”列中打印两个 C 字符之间的距离时,例如,如果“文本”列的值为 DCFRCGHCCRF,则应在第三列 1C2C2CC2 中打印

示例输入

c32_g1_i1_3,SCIPKHEECTNDKHNCCRKGLFKLKCQCSTFDDESGQPTERCACGRPMGHQAIETGLNIFRGLFKGKKKNKKTKG
c32_g1_i1_6,ACAERKKKCTKDDDCSCCGKWDKCSCNWPGREGCFCMRGMMATRLWKMAKC

示例输出

c32_g1_i1_3,SCIPKHEECTNDKHNCCRKGLFKLKCQCSTFDDESGQPTERCACGRPMGHQAIETGLNIFRGLFKGKKKNKKTKG,1c6c6cc8c1c13c1c31
c32_g1_i1_6,ACAERKKKCTKDDDCSCCGKWDKCSCNWPGREGCFCMRGMMATRLWKMAKC,1c6c5c1cc5c1c7c1c14c0

答案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

另一方面,当字符串末尾有匹配项时,将生成空的尾随字段(当 LIMIT 给定且不为 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来自删除空数组元素的最快方法

相关内容