我有一个包含多行和各种内容的文件。某些行以特定模式开始,可能会再次发生。 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 ..
答案 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系统(我认为包含您可能关心的任何系统),您可以将sort
和uniq
个调用合并为一个{{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仅包含唯一值,因此您的目的已得到解决。这是套装的实际用途之一。