2014-01-09 5 views
1

거대한 파일의 일부 문자열에 grep을 적용하려고합니다. 그러나, 그 라인을 awk 스크립트를 통해 grep 명령에 전달하고 싶습니다. 또한 출력물이 스크립트로 리디렉션되기를 원합니다. 파일에서 레코드를 읽는 awk 스크립트가 있습니다. grep을 몇 가지 레코드에만 적용하기를 원합니다. 현재 레코드 $ 0는 grep이 사용될 텍스트입니다. 어떻게해야합니까? 현재이 문제를 해결하려고합니다. -grep via awk를 사용하는 방법?

system("grep --count -w 'GOOD' \n" $0) 

하지만 작동하지 않는 것 같습니다. 무엇을 사용해야합니까?

+0

을 수행 할 수 있습니다 그것은 더 나은 우리에게 당신이 그것에서 무엇을 좋아 일부 데이터를 표시하려면 그리고 거기에 도착하는 방법. 이렇게하면 솔루션을 만들 수 있습니다. 나는 awk 안에 grep의 필요성을 알지 못한다. 모든 것을 할 수 있어야한다. – Jotne

+2

awk는 매우 유연하고 강력하며 grep이 할 수있는 모든 일을 할 수 있기 때문에 awk의 출력을 grep해야 할 때가 거의 없습니다. –

+0

@FredrikPihl이 옳습니다. 말했듯이 "거대한"파일이 있다면 각 줄마다 grep 프로세스를 시작했습니다. grep은 빠르지 만 10m 정도는 생각합니다. grep 논리를 awk에 병합하면 더 나은 성능을 얻을 수 있습니다. 현재 질문에 대한 설명에서 요구 사항은 다소 흐릿합니다. – Kent

답변

2

이은 GNU awk는 당신이 \<\>을 사용할 수있는 것은 시작과 끝을 맞게

gawk '/\<GOOD\>/{++i} END{print i}' 

grep -wc 'GOOD' file 
,691으로 동일한 작업을 수행하는 단어, 그래서

당신은 차례 나오는의 총 수를 계산하려면 (라인뿐만 아니라 수를,뿐만 아니라 라인/기록 주어진 내 차례 나오는)

gawk 'BEGIN { FPAT="\\<GOOD\\>"; RS="^$" } { print NF }' file 
로, 당신은 GNU awk는 버전 4에서 FPAT을 사용할 수 GOOD 단어의 경우 당신은 예를 레코드 번호 3, 주어진 레코드의 문구 GOOD DI의 정확한 일치의 수를 계산하려면

, 당신은

gawk 'NR==3 { print patsplit($0,a,/GOOD DI/) }' file 
+0

내가 다른 답변에 대한 의견으로 제공 한 샘플을 위해 작동합니까? – user657592

+0

@ user657592 '좋은 DI'와 같은 공백을 포함하는 단어를 찾으십니까? –

+0

예. 기록에 '좋은 DI'가 나타나는 횟수를 원합니다. 그러나 나는 공간과 함께 그 방식으로 그것을 원한다. – user657592

1

귀하의 질문은 명확하지 않으며 입력 파일 중 일부, 지금까지 가지고있는 전체 스크립트 및 달성하고자하는 결과를 보여 주시면 도움이됩니다. 그 동안

, 상반되는 내용을 제안하는 귀하의 질문에 아무것도 없기 때문에, 당신이 할 수있는 다음 :

awk 'somescript' somefile | grep --count -w 'GOOD DI' 
+0

샘플'GOOD DI는 GOOD DIN만큼 행복한 것은 아니지만 GOOD DIN이 그다지 행복한 것은 아닙니다. 좋은 DI가 망상이다 ' – user657592

1

당신은 텍스트 문자열에 그렙을 적용 할 수있는 당신이 무엇을 사용할 수 있습니다 하고있다. 당신이 정말로 GREP/시스템 뭔가를 사용해야 할 경우 필요한 것 다음과 같이 :

시스템 ('에코' "$ 0"으로 '| 그렙 --count -w'foo는 ' ")

는하지만이 좋지 않습니다 카운트가 하나의 라인에있는 횟수가 아니라 현재 발생한 라인을 카운트합니다. 또는 그렇게 보인다.

만약 당신이 분할 seperator로 정규식을 사용하면 split occurences +1의 수를 얻을 수 있습니다.

그래서 작동합니다 다음
awk '{printf FNR; a=split($0,myarray,/.OOD/); print " "a-1}' file.txt 

당신의 정규식이 발생 횟수와 각 LINENUMBER을 인쇄 할 것이다. (GOOD, 식품 대표이 경우 ".OOD".에, 분위기 등)

0

당신이 그것에게 구식 방법

awk 'BEGIN{count=0} { 
    for(i=1;i<=NF; i++) { 
    if($i == "GOOD"){ 
     ++count 
    } 
    } 
}END { 
    print count 
}' file 
관련 문제