检查字符连续出现的频率

检查字符连续出现的频率

我需要一种方法(在 Bash 中)来检查字符的连续出现,但是在将其视为第二个变量之前,它还需要能够有出现次数的限制,这样较大的集合就会首先出现。例如,假设我有一封二进制字母,我需要脚本能够执行以下操作:

01111100

报告为

03200

或者

01001111

作为

010031

或者

01011001

作为

0102001

没有 awk,除非它确实是 bash shell 中唯一可行的方法

答案1

如果你不介意 perl,你可以

  • 匹配单个 0 或 1 到 3 个 1 序列的实例

  • 将零映射到它们自身,并将个序列映射到它们的长度

例如

perl -lne '@runs = $_ =~ /(0|1{1,3})/g; print map { $_==0 ? $_ : length $_ } @runs'

使用提供的字符串进行测试:

cat << EOF | \
  perl -lne '@runs = $_ =~ /(0|1{1,3})/g; print map { $_==0 ? $_ : length $_ } @runs'
01111100
01001111
01011001
EOF

输出

03200
010031
0102001

如果 perl 不是一个选项,您可以使用其他正则表达式工具执行相同的操作,例如使用 grep 和 bash 数组

mapfile -t runs < <(echo '01111100' | grep -Eo '0|1{1,3}')

然后

for r in "${runs[@]}"; do ((r == 0)) && printf '0' || printf '%d' "${#r}"; done; printf '\n'
03200

相关内容