计算匹配模式的行数,但只计算第一次出现的行数

时间:2014-09-08 11:24:59

标签: python bash count grep unique

我有一个包含多行和各种内容的文件。某些行以特定模式开始,可能会再次发生。 E.g。

some line
some line
this: idA001 text
this: idA002 text
some line
this: idB001 text
this: idA001 text
this: idA002 text
this: idC001 text
...

我想计算每次第一次出现的this: id* ..

如果我使用cat file | grep "this: " | wc -l我会计算每次出现的事情..我是否需要编写一个脚本,该行的第一个过滤器然后消除重复,或者这是否可以在一行bash命令中? 如果需要脚本,我更喜欢Python或Bash ..

4 个答案:

答案 0 :(得分:2)

这应该做:

awk '/^this:/ && !seen[$0]++ {a++} END {print a}' file
4

它将计算以this:

开头的唯一行数

答案 1 :(得分:2)

如果你想用bash one-liner执行此操作:

sort < file | uniq | grep "this: " | wc -l

uniq命令删除重复的行。

但我们希望过滤掉不一定相邻的重复行,所以我们先sort

其余部分与原始命令相同。

使用更新的* nix系统(我认为包含您可能关心的任何系统),您可以将sortuniq个调用合并为一个{{1} }。另外,正如jm666指出的那样,grep -c会输出匹配行的数量,而不是匹配行,因此您不需要sort -u。所以整个事情变成了:

wc

最后一件事:如果你只想要以sort -u < file | grep -c "this: " 开头的行,而不是在任何地方包含它的行,你可以在grep表达式中使用this:特殊字符,它只匹配一行的开头,如下:

^

答案 2 :(得分:1)

单行我们可以这样做

len({i for i in file if i.startswith('this :id')})

答案 3 :(得分:-1)

这将是一个简单的解决方案:

my_words = ['this: id']
a = set()
with open('got.txt') as f:
    for line in f:
    if any(word in line for word in my_words):
            a.add(line)
print len(a)

我做了什么:我在一组中写了包含'this:id'的行。由于set仅包含唯一值,因此您的目的已得到解决。这是套装的实际用途之一。