Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算与模式匹配但仅第一次出现的行数_Python_Bash_Count_Grep_Unique - Fatal编程技术网

Python 计算与模式匹配但仅第一次出现的行数

Python 计算与模式匹配但仅第一次出现的行数,python,bash,count,grep,unique,Python,Bash,Count,Grep,Unique,我有一个包含多行和各种内容的文件。有些行以特定的模式开始,可能会重复出现。例如 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文件| grep”这个:“| wc-l我会计算每次出现的次数。。我是否需要编写一

我有一个包含多行和各种内容的文件。有些行以特定的模式开始,可能会重复出现。例如

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文件| grep”这个:“| wc-l
我会计算每次出现的次数。。我是否需要编写一个脚本,首先对行进行筛选,然后消除重复项,或者在一行bash命令中可以这样做?
如果需要脚本,我更喜欢Python或Bash

在单行中,我们可以这样做

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

在单行中,我们可以这样做

len({i for i in file if i.startswith('this :id')})
这应该做到:

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

开头的唯一行数,该行应执行以下操作:

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

如果要在bash one liner中执行此操作,它将计算以this:

开头的唯一行数:

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

sort -u < file | grep -c "^this: "
sort-u
如果要在bash one liner中执行此操作:

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

sort -u < file | grep -c "^this: "
sort-u
这将是一个简单的解决方案:

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”的行写入一个集合。因为集合只包含唯一的值,所以您的目的就解决了。这是集合的实际使用之一

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

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”的行写入一个集合。因为集合只包含唯一的值,所以您的目的就解决了。这是集合的实际使用之一

那么4是正确答案吗?正确。抱歉,我没有在问题中说明这一点。
sort
作为旁注,您几乎不需要
cat file | foo
;只是
foo
做同样的事情,更简单、更有效。如果你有
this:idC001 other text
-那是唯一的还是不唯一的。。。(即,现在仍然是4,还是现在是5?)那么4是正确答案吗?正确。抱歉,我没有在问题中说明这一点。
sort
作为旁注,您几乎不需要
cat file | foo
;只是
foo
做同样的事情,更简单、更有效。如果你有
this:idC001 other text
-那是唯一的还是不唯一的。。。(即,现在还是4,还是5?)不要在调用
set
时使用列表理解。使用集合理解(如果您使用的是Python 2.7+),或者在对
set
的调用中使用生成器表达式。否则,仅仅为了构建一组列表,就浪费了您的时间。另外,不要调用
readlines()
;这也浪费了建立一个列表。只需对文件中的i使用
。如果i.startswith('this:id'),可能也应该是
通过OP的某行以特定的pattern@JonClements感谢大家纠正了我的答案:)而且你可能想使用
集合的
len
——而不是它的
总和(sum
:)不要在调用
集合时使用列表理解。使用集合理解(如果您使用的是Python 2.7+),或者在对
set
的调用中使用生成器表达式。否则,仅仅为了构建一组列表,就浪费了您的时间。另外,不要调用
readlines()
;这也浪费了建立一个列表。只需对文件中的i使用
。如果i.startswith('this:id'),可能也应该是
通过OP的某行以特定的pattern@JonClements感谢大家纠正了我的答案:)而且你可能想取
集合的
len
——而不是它的
总和(我提取了
id
,与文本的其余部分分开计算,因为我已经为Python打开了它,所以我已经——但是使用这种方法和适当地使用
grep
可以很容易地做到这一点:)使用*nix工具方法可以减少内存占用毕竟这对我来说可能非常有用!非常感谢。@JonClements:Python版本当然有在Windows上工作的优势(但是我不记得上次我使用Windows机器时没有安装msys或cygwin,也没有将机器扔出窗口,所以这对我来说很少有关系……)。您可以使用
grep-c
,而不需要
wc
;)@jm666:谢谢。不知道我怎么忘了…我提取了
id
,与文本的其余部分分开计算,因为我已经为Python打开了它,所以我已经——但是使用这种方法和适当地使用
grep
可以很容易地做到这一点:)使用*nix工具方法可以减少内存占用毕竟这对我来说可能非常有用!非常感谢。@JonClements:Python版本当然有在Windows上工作的优势(但是我不记得上次我使用Windows机器时没有安装msys或cygwin,也没有将机器扔出窗口,所以这对我来说很少有关系……)。您可以使用
grep-c
,而不需要
wc
;)@jm666:谢谢。不知道我是怎么忘记的…为什么要用一个单词的列表把它复杂化?(同时,将其称为“单词”似乎有点误导…)除了更加冗长和缩进错误之外,这与sundar的解决方案相比有什么不同呢?他说bash或python。Bash解决方案已经给出,所以我提供了python。知道一个替代方案没什么错。Sundar的解决方案也是用Python实现的。他的作品生动、地道、简洁、易读。你所拥有的一切