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

Unix:使用sort和uniq仅获取行的单个开头的计数,unix,Unix,我正在尝试创建一个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 12

我正在尝试创建一个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*

非常感谢您提供的任何帮助或建议。

如果您只想获得与给定图案匹配的线条数,请执行以下操作:

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

如果您真的想获得表单
的输出,您需要一些更复杂的东西:

grep -e '^123' test.txt | sed 's/^123.*/123/' | uniq -c
其工作原理是首先查找以
123
开头的行(与前面一样),然后
sed(1)
删除每行中
123
模式之后的所有内容,最后
uniq(1)
统计剩余的行数。输出为:

3 123

好吧,它没有您在示例中显示的尾随
*
,但我认为它已经足够接近了。

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

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

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

要获得所有3个字符前缀计数,可以执行以下操作

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

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