일부 데이터가 포함된 파일을 처리하는 다음 스크립트가 있습니다. 먼저 헤더를 출력 파일에 인쇄합니다. 그런 다음 입력에서 무작위로 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
.
shuf
GNU 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