2014-09-08 2 views
0

여러 줄 및 다양한 내용의 파일이 있습니다. 일부 줄은 특정 패턴으로 시작합니다. 다시 발생합니다. 예 :패턴과 일치하는 행 수를 계산하지만 첫 번째 발생 만

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 명령에서 가능합니까? 이 수행해야하는 스크립트 내가 한 줄에 파이썬이나 배쉬 ..

+0

정답은 4입니까? –

+0

이 맞습니다. 미안해, 그 질문에 그걸 말하지 않았어. –

+0

'sort abarnert

답변

2

bash 한 줄자 :

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

uniq 명령은 반복되는 줄을 제거합니다.

그러나 반드시 인접하지는 않은 중복 된 줄을 필터링하려면 먼저 sort을 입력해야합니다.

나머지는 원래 명령과 같습니다.

(난 당신이 걱정하는 가능성이있어 모든 시스템을 포함한다) 생각보다 최근의 유닉스 계열의 시스템과

, 단일 sort -usortuniq 전화를 결합 할 수 있습니다. 또한 jm666이 지적했듯이 grep -c은 일치하는 줄 대신 일치하는 줄의 수를 출력하므로 wc은 필요하지 않습니다. 그래서 모든 일이된다 :

sort -u < file | grep -c "this: " 

마지막으로 한가지 : 당신은 어디를 포함하는 행에 반대, this:로 시작하는 라인을 원한다면, 당신이 당신의 그렙 표현에 ^ 특수 문자를 사용할 수있는 경우에만 과 같이, 줄의 시작과 일치한다 :

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) 

내가 한 짓을 : 내가 근래

sort -u < file | grep -c "^this: " 
+0

그냥 마음에 두었던 것입니다. 고맙습니다! –

+0

나머지 텍스트와 별도로 계산할'id '를 추출했습니다. 파이썬에서 이미 열었으므로 (여기에 넣었습니다) (https://gist.github.com/joncle/19944eeb2a25cc597c09) -하지만이 방법을 사용하고 적절하게'grep'을 사용하여 쉽게 할 수 있습니다 :) * nix 도구를 사용하여 메모리 사용량을 줄입니다 –

+0

이것은 나에게 매우 유용 할 수 있습니다! 고맙습니다. –

1

를 원합니다 필요한 경우 우리는이

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

'set'을 호출 할 때 목록 이해력을 사용하지 마십시오. (파이썬 2.7 이상인 경우) set comprehension을 사용하거나'set'에 대한 호출 내에서 생성자 표현식을 사용하십시오. 그렇지 않으면 목록을 구축하기 위해 목록을 낭비하고 있습니다. – abarnert

+0

@abarnert got –

+0

또한,'readlines()'를 호출하지 말아라. _also_ 불필요하게 목록을 작성합니다. 'for i in file'을 사용하십시오. – abarnert

2

같이 수행 할 수 있습니다

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

그것은 얼마나 많은 계산합니다 this:로 시작하는 고유 한 줄

-1

이 간단한 해결책이 될 것입니다 e는 'this : id'가 포함 된 행을 썼습니다. 세트에는 고유 한 값만 포함되므로 용도가 해결됩니다. 이것은 세트의 실제 사용 중 하나입니다.

+0

왜 한 단어로 그 목록을 복잡하게 만드나요? (또한 "단어"라고 부르는 것은 약간의 오해를 불러 일으킬 것 같은데 ...) 그리고 좀더 장황하고 잘못 들여 놓는 것 이외에, 이것이 썬더의 해결책에 무엇을 가지고 있을까요? – abarnert

+0

그는 bash 또는 python이라고 말했습니다. Bash 솔루션은 이미 제공되어 파이썬을 제공했습니다. 대안을 아는 데는 잘못된 것이 없습니다. –

+0

Sundar의 솔루션은 Python에도 있습니다. 그리고 그는 일하고, 관용적이며, 간결하며, 읽을 수 있습니다. 당신이해온 모든 일은 그의 이해력을 풀고, 아무런 도움이되지 않는 더 많은 복잡성을 추가하고 그것을 깨뜨린 것입니다. – abarnert

관련 문제