Unix:使用sort和uniq来获取单个行开头的计数



我正在尝试创建一个Unix脚本,它将给我一个独特的开始行计数。例如,我有一个test.txt文件,其中包含以下行:

123456
124365
123546
126453
125436
123654
124365

假设我想知道以123开头的行数

sort test.txt | uniq -c的输出为:

1 123456
1 123546
1 123654
2 124365
1 125436
1 126453

我想弄清楚如何编辑这个,以便它给我一个类似的输出:

3 123*

要获取所有的3个字符前缀计数,您可以这样做

 cut -c1-3 test.txt | sort | uniq -c
  3 123
  2 124
  1 125
  1 126

首先,有一个问题,您的数据集没有测试。如果你有一个数字在字符串的其他地方有123,在中间或结尾。因此,假设我们将99123999999123添加到文件中。

在这种情况下你不需要排序,你只需要过滤和计数行。

cat test.txt | grep 123

这将导致以下输出:

123456
123546
123654
9912399
9999123

这显然是错误的,我们正在捕捉123的任何实例。为了确保我们只在字符串的开头检查123,我们需要将^字符添加到grep参数中。

cat test.txt | grep ^123

现在我们得到如下结果:

123456
123546
123654

现在我们只需要计算行数,我们可以通过将其管道输出到wc命令,并传递-l让它知道计算行数而不是字符数。

cat test.txt | grep ^123 | wc -l

结果是:

   3

cat test.txt | cut -c -3 | sort | uniq -c | sort -rn

如果您只想获得与给定模式匹配的行数,则可以这样做:

grep -c '^123' test.txt

-c选项指示grep(1)只计算匹配(并抑制通常的输出)。模式中的^匹配一行的开头,因此该命令计算test.txt中以序列123开头的行数。

如果您真的想要得到形式<count> <pattern>的输出,您将需要一些更复杂的东西:

grep -e '^123' test.txt | sed 's/^123.*/123/' | uniq -c

首先查找以123开头的行(和以前一样),然后sed(1)删除每行中123模式之后的所有内容,最后uniq(1)计算剩下的行数。输出为:

3 123

它没有你在例子中展示的结尾的*,但我认为它已经足够接近了。

最新更新