행궁동 데이터 엔지니어

반응형

리눅스에서 랜덤 하게 데이터를 추출하는 방법 2가지를 소개합니다.

 

  1. sort 명령어 사용 (-r 옵션)
  2. shuf 명령어 사용 (-n 옵션)

2가지 방법중 shuf 명령어가 속도가 빠르니 shuf 명령어 사용을 권장합니다.

아래에 time 명령어를 활용한 sort, shuf 명령어 실행시간 테스트 결과도 첨부합니다.

 

  • 테스트 데이터 : 전국 아파트 거래내역 데이터 1만 개
  • 랜덤 추출 개수 : 1개 행
  • time 명령어 사용 테스트 결과, 테스트 방법 : time(명령어)
  • sort 명령어 : 0.022s
  • shuf 명령어 : 0.006s

랜덤추출 및 실행시간 측정 결과

1. sort 명령어  : -r 옵션과 | (파이프} head -n 명령어(상위 n개 행 추출) 사용

# sort -r [개수] | head -n [개수]

sort -r sample_apart_deal.csv | head -n 1

# sample_apart_deal.csv 파일에서 랜덤하게 1개 행을 선택

 

2. shuf 명령어  : -n 옵션 사용

# shuf -n [개수] [파일명]

shuf -n 1 sample_apart_deal.csv

# sample_apart_deal.csv 파일에서 랜덤하게 1개행 선택

 

# 기타 : 실행시간 측정 스크립트

스크립트를 사용 실행시간 측정 결과

#!/bin/bash

# Using sort
# %s:Unix time (since 1970-01-01 00:00:00), %N:Nano
st_time=$(date +%s%N)
# echo "$((($end_time-$st_time) / 1000000)) sec"
sort -r /media/sf_D_DRIVE/datasets/sample_apart_deal.csv | head -n 100 > /media/sf_D_DRIVE/datasets/sort.csv
end_time=$(date +%s%N)
elapsed=`echo "($end_time-$st_time)/1000000" | bc`
elapsedSec=`echo "scale=6;$elapsed/1000" | bc | awk '{printf "%.6f", $1}'`
echo "#1 using sort\nsort -r [file_nm] | head -n 100 > [outfile] : $elapsedSec sec"

# Using shuf
st_time=$(date +%s%N)
elapsed=`echo "($end_time-$st_time)/1000000" | bc`
elapsedSec=`echo "scale=6;$elapsed/1000" | bc | awk '{printf "%.6f", $1}'`
shuf -n 100 /media/sf_D_DRIVE/datasets/sample_apart_deal.csv > /media/sf_D_DRIVE/datasets/shuf.csv
end_time=$(date +%s%N)
elapsed=`echo "($end_time-$st_time)/1000000" | bc`
elapsedSec=`echo "scale=6;$elapsed/1000" | bc | awk '{printf "%.6f", $1}'`
echo "#2 using shuf\nshuf -n 100 [file_nm] > [outfile] : $elapsedSec sec"

 

1. 생물정보학자의 블로그, [리눅스] 텍스트 파일에서 random으로 n개 라인 뽑기, https://korbillgates.tistory.com/88
2. Serive for Every Master님 블로그, [bash] 경과시간 출력하기, https://netmaid.tistory.com/34

 

반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band