这是我上一个问题的延伸(“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
来自删除空数组元素的最快方法)