2012-05-07 4 views
0

나는 "grep"을 사용하여 2.txt에서 1.txt의 일부 패턴을 찾고 있습니다. 그런 다음 몇 가지 조작을하십시오. 그러나 큰 텍스트의 경우 "grep"이 너무 느립니다.gret에 대안

for ((i=1; i<=236410; i++)) 
do 
    head -$i 1.txt|tail -1|grep -f - 2.txt|awk '{mul+=$4*$7} END {print $1,$2,$3,mul}' 
done > file1 

나는 어떤 대안이 궁금 할까? 보인다 awk/sed는이 작업을 수행 할 수 있지만, 단지 변수 AWK에 head -$i 1.txt|tail -1 또는 들으

+1

귀하의'head' /'tail' 콤보가 느린 것입니다. – tripleee

+0

예, 왜 모든 시간 대신에 한 번에 한 줄씩 진행합니까? – Kevin

+0

어떻게해야할까요? – user815408

답변

1

입력의 양을 처리 할 수 ​​grep을 가정하여 패턴 파일이 236,410 선이 가정,와 sed 방법 파이프 알 수없고, 출력 파일의 순서를 가정하는 것은 메모리가 문제이며, 귀하의 의견은 정적 문자열 대신 fgrep으로 시도하는 경우 단지

grep -f 1.txt 2.txt | awk ... >file1 

을하지 왜 중요하지 않다; 더 많은 양의 패턴을 처리 할 수 ​​있습니다. 출력의 순서가 실제로 중요하다면 이와 같은 것은 훨씬 빨라야합니다. 입력에 따라

while read line; do 
    grep "$line" 2.txt | awk ... 
done <1.txt >file1 

, 당신이 공백을 처리하기 위해 read에 몇 가지 옵션을 IFS로 깨끗이 및/또는 추가 할 수 있습니다, 백 슬래시 등

만 입력의 236,410 첫 선을 원하는 경우에

, 당신 변경할 수 있습니다

head -n 236410 1.txt | 
while read line ... 

위의 방법 중 어느 것도 적합하지 않다면 다른 아이디어가 있습니다. 실제 처리에 awk을 사용하고 있기 때문에 모든 처리를 awk 스크립트로 리팩토링하거나 sed 스크립트를 즉시 작성하여 그 결과를 awk으로 전달할 수 있습니다. 이것은 조금 관여하고, 다시 패턴의 모양에 따라 달라집니다하지만,이 같은 당신에게 아이디어를 줄 것이다 :

sed 's%.*%/&/p%' 1.txt | less 

은 당신이보고있는 것은 경기가 각각있을 경우 인쇄하는 sed 스크립트입니다 1.txt의 패턴 중 하나입니다. (어떤 패턴에 슬래시가 포함되어 있으면 망가질 것입니다. 사소한 경우에는 다른 구분 기호를 사용하거나 패턴의 모든 슬래시를 이스케이프 처리하십시오.) 이제 파일에 저장하거나 (sed에서 스크립트를 처리 할 수 ​​있다면

sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | less 

을 그리고 당신이 awk에 전달할 것 인 것이다 : 표준 입력) sed의 두 번째 인스턴스에 전달

sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | awk ... >file1