2013-07-03 3 views
5

큰 데이터 파일 (~ 100MB-1GB 텍스트)과 관심있는 데이터 요소를 인덱싱하는 수만 개의 타임 스탬프가 정렬 된 목록이 있습니다. 타임 스탬프 파일은 다음과 같습니다큰 파일을 점진적으로 그려보기

12345 
15467 
67256 
182387 
199364 
... 

과 같은 데이터 파일은 같습니다

Line of text 
12345 0.234 0.123 2.321 
More text 
Some unimportant data 
14509 0.987 0.543 3.600 
More text 
15467 0.678 0.345 4.431 

두 번째 파일의 데이터는 모두 타임 스탬프의 순서입니다. 첫 번째 파일의 타임 스탬프를 사용하여 두 번째 파일을 grep하고 타임 스탬프와 네 번째 데이터 항목을 출력 파일에 출력하려고합니다. 나는 이것을 사용 해왔다 :

grep -wf time.stamps data.file | awk '{print $1 "\t" $4 }' >> output.file 

이것은 각 데이터 파일을 완료하는 데 걸리는 하루가 걸린다. 문제는이 명령이 time.stamps의 모든 행에 대해 전체 데이터 파일을 검색하지만 마지막 데이터 점에서 픽업하기 위해 검색 만하면된다는 것입니다. 이 과정의 속도를 높이는 방법이 있습니까? JS 웃의 awk 솔루션 당신은 완전히 awk에서이 작업을 수행 할 수 있습니다

답변

4

...

awk 'NR==FNR{a[$1]++;next}($1 in a){print $1,$4}' timestampfile datafile 
+1

+1 : 어떻게 작동하는지 이해하는 데 약간의 시간이 걸렸지 만, 스크립트의 첫 번째 부분이 모든 타임 스탬프를 배열 'a'로로드하고 두 번째 부분이 데이터 파일에있는 첫 번째 필드의 배열을 살펴보면 모든 타임 스탬프를 저장할 수있는 충분한 메모리가 필요한 매우 세련된 솔루션임을 알 수있었습니다. – Simon

+1

@ 시몬 당신은 빠른 학습자 제 친구입니다. 그것은 정확하게 그것을합니다. 성능 향상을 위해 배열 요소가 일치 한 후에 삭제할 수 있습니다. 해당 요소가 파일 아래로 다시 발생하면 일치하지 않지만 다음 스캔의 크기가 줄어 듭니다. –

+0

니스! 이전에 8 시간이 걸린 작업은 12 초가 걸렸습니다. – user2548142

1

아마 길을 가야하는 것입니다. join을 사용할 수 있고 관련이없는 "data"의 첫 번째 필드가 숫자가 아니면 파일이 동일한 순서로 있고 정렬 단계가 수행되지 않는다는 사실을 이용할 수 있습니다. 이 예는 리눅스

join -o2.1,2.4 -1 1 -2 1 key.txt <(awk '$1 ~ /^[[:digit:]]+$/' data.txt) 
0

'그렙'파일 이름에서 패턴을 가져오고 매칭을 수행하는 작은 사용 옵션 -f filename을 가지고에 bash는 공정 대체를 사용합니다. awk 솔루션을 이길 가능성이 높으며 타임 스탬프를 정렬 할 필요가 없습니다.

관련 문제