如何计算Bash中跨行出现的连续模式的数量?

问题描述

例如,我有一个这样的文件。如何计算连续N个跨行出现的次数

NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
CACTGCTGTCACCCTCCATGCACCTGCCCACCCTCCAAGGATCNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNGgtgtgtatatatcatgtgtgatgtgtggtgtgtg
gggttagggttagggttaNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNAGaggcatattgatctgttgttttattttcttacag
ttgtggtgtgtggtgNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

预期结果为4,因为有4N
我尝试了grep -Eozc 'N+',但结果是1
如果可能的话,我希望也能显示N的行号和长度

解决方法

awk '$1=$1' FS='' OFS='\n' file | uniq -c | grep -c N

tr -d '\r\n' < file | grep -o 'N*' | grep -c .

输出:

4
,

以纯色bash方式,无需使用任何外部命令:

const Degree = require('../models/index.js').Degree;
const Teachers = require('../models/index.js').Teachers;

exports.index = (req,res) => {
    Degree.findAll({
        include: Teachers,order: [
            ['degreeId','DESC']
        ]
    }).then(results => {
        if (results.length > 0) {
            res.status(200).json({
                'error': false,'status': 200,'data': results
            });

            res.end();
        } else {
            res.status(200).json({
                'error': false,'message': 'No records available'
            });

            res.end();
        }
    }).catch(err => {
        console.log(err);

        res.status(500).json({
            'error': true,'status': 500,'message': 'Internal Server Error'
        });
    });
};

输出:

v=$(<file)X
v=${v//[[:space:]]}
v=${v//N[^N]/ }
v=${v//[^ ]}
echo ${#v}
,

有点长,但是很简单:

< tmp.txt \
  tr -d '\n' |  # Strip newlines
  tr -s N |     # Collapse strings of Ns to a single N
  tr -dC N |    # Strip anything that *isn't* an N
  wc -c         # Count the resulting Ns

单线:

< tmp.txt tr -d '\n' | tr -s N | tr -dC N | wc -c
,

从Bash调用Ruby One-Liner

无论是从文件还是从标准输入中读取,您都可以将其作为Bash的Ruby单一代码来进行。例如:

$ ruby -e 'puts ARGF.read.delete("\n").scan(/N+/).count' example.txt
4

$ ruby -e 'puts ARGF.read.delete("\n").scan(/N+/).count' <<< "$str"
4

此概念是将整个文件包含在内,删除所有换行符,然后计算连续的N个字符的组。

注意:如果要忽略孤立的N,则只需扫描/N{2,}/。那只会计算两个或更多N字符的运行。

,

假设您的数据位于名为test.txt的文件中:

  1. 我们从中读取所有数据。
  2. 显示与我们的模式匹配的行(以N开头和结尾,并且仅包含N
  3. 计数行数

这是执行此操作的代码:

cat test.txt | egrep -oe "^N*$" | wc -l

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...