텍스트 처리 속도 향상

텍스트 처리 속도 향상

일부 데이터가 포함된 파일을 처리하는 다음 스크립트가 있습니다. 먼저 헤더를 출력 파일에 인쇄합니다. 그런 다음 입력에서 무작위로 60000줄을 선택하여 출력에 인쇄합니다(동일한 줄을 여러 번 인쇄할 가능성은분명히원함).

N = 60000
gawk '{if (NR < 37) print $0}' input > output
MAX=$(gawk 'END{print NR}' input)

for ((i=1; i<=$N; i++ ))
do

   declare $(gawk -v min=37 -v max=$MAX -v seed=$RANDOM 'BEGIN{srand(seed); print "x="int(min+rand()*(max-min+1))}')
   gawk -v l=$x 'NR>36 && NR==l {print $0}' input >> output

done

나는 이것이 매우 비효율적이라고 생각하므로 이 코드의 성능을 향상시키는 방법에 대한 아이디어를 열려고 합니다. 입력 파일을 항상 열고 닫는 것을 중지하는 것이 가능할 수도 있습니다.

시간 내 주셔서 감사합니다!

답변1

먼저 이름이 지정된 파일에서 36행의 헤더를 추출한 input다음 파일의 나머지 부분에서 60000행을 무작위로 선택하고 동일한 행을 여러 번 무작위로 선택할 수 있습니다. 모든 출력은 output.

shufGNU coreutils 사용 :

#!/bin/sh

# Fetch header (36 first lines)
head -n 36 <input >output

# Scramble the other lines and pick 60000 (allowing for repeated lines)
tail -n +37 <input | shuf -r -n 60000 >>output

또는:

( head -n 36 <input; tail -n +37 <input | shuf -r -n 60000 ) >output

GNU를 사용하면 head출력의 마지막 줄 바로 뒤에 입력 파일 스트림을 유지합니다. 즉, 읽기가 끝난 위치에서 계속할 shuf수 있습니다 (이 기능은 작동하지 않을 수 있음).head일부비 GNU head구현):

( head -n 36; shuf -r -n 60000 ) <input >output

관련 정보