Unix:使用sort和uniq来计算只有单独的行首

时间:2015-08-24 19:58:16

标签: 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 123*

非常感谢任何帮助或建议。

3 个答案:

答案 0 :(得分:0)

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

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

嗯,它没有你在示例中显示的尾随*,但我认为它足够接近。

答案 1 :(得分:0)

首先,您的数据集无法测试。如果你有一个数字在字符串中的其他地方,中间或末尾有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

答案 2 :(得分:0)

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