2012-07-10 2 views
3

grep 명령을 사용하여 파일에서 필요한 정보를 가져옵니다. 다음과 같은 두 개의 grep 문을 사용합니다.여러 문자열을 grepping

XXXX='grep XXXX FILE A|sort|uniq|wc -l' 
grep YYYY FILE A|uniq| > FILE B 

이제 파일을 두 번 통과시킵니다. 그러나 나는 단지 하나의 파일 탐색에서이 두 단계를 수행 할 수 있는지 알고 싶습니다. 즉, egrep과 비슷한 것을 사용할 수 있는지 알고 싶습니다. 여기서 두 문자열과 한 문자열에 대해 grep을 사용할 수 있습니다. 변수에서 stroring하고 다른 문자열을 파일로 출력합니다.

답변

1

다음과 같은 코드를 사용할 수 있습니다. 여기서는 모든 파일에서 XXXX 또는 YYYY가 포함 된 행을 한 번만 검색하고 결과 행을 배열에 저장합니다. 그런 다음이 배열의 요소를 사용하여 XXXX가 포함 된 행과 YYYY가 포함 된 행을 선택합니다.

filtered=`grep -E '(XXXX|YYYY)' FILE A` 
XXXX=`for line in ${filtered[@]}; do echo $line; done | grep XXXX | sort | uniq | wc -l` 
for line in ${filtered[@]}; do echo $line; done | grep YYYY | uniq > FILE B 

따라서 파일은 두 번 이동하지 않습니다!

+0

이 방법은 입력 크기가 사용 가능한 메모리보다 커지고 작은 데이터 배치에 대해서만 의미가있는 경우 신속하게 파열됩니다. – mavam

+0

목적이 변수에 데이터를 저장하는 것이면 (이 질문의 경우) 큰 입력은 항상 메모리를 채울 수 있습니다. – mostar

0

아니면 분리와 egrep을 사용

egrep '(XXXX|YYYY)' FILE A | sort | uniq | ... 

또는 AWK :

awk '/XXXX|YYYY/' FILE A | sort | uniq | ... 
+0

답장을 보내 주셔서 감사합니다. 요점을 이해합니다 ...하지만 두 개의 변수에 2 개의 grep 문 결과를 저장할 수 있습니까? – User

+0

입력 데이터의 크기는 얼마나됩니까? 이는 소규모 데이터 볼륨에 대해서만 의미가 있습니다. awk에서 연관 배열을 살펴보십시오. – mavam

+0

입력 데이터의 범위는 200MB입니다. 대용량 파일 – User

0

'|' 귀하의 질문에 기호, 아마도 당신은 YYYY 라인도 sort에 파이프하기위한 것,이 경우 단순히 할 수있는 (또는 sort -u을 사용!) :

awk '/XXXX/ { if(!x[$0]++) xcount += 1 } 
    /YYYY/ { if(!y[$0]++) ycount += 1 } 
    END { print "XXXX:", xcount 
     print "YYYY:", ycount 
     for(i in y) print i | "sort > FILEB" 
    }' FILE 

이 한 번 파일을 검색, 카운터 될 때마다 증가 적절한 패턴을 포함하는 유니크 라인이 보인다. YYYY 행의 배열에 대한 반복 순서는 잘 정의되어 있지 않으므로 정렬이 필요합니다. 일부 버전의 awk는 외부 유틸리티에 의존하지 않고 배열을 정렬 할 수있는 기능을 제공합니다. 그렇게하고 싶다면 perl을 사용하십시오.

관련 문제