bed파일을 무작위로 10000 번 정렬하고 매번 상위 1000 행을 가져와야합니다. 현재 다음 코드를 사용하고 있습니다.
for i in {1..100}; do
for j in {1..100}; do
sort -R myfile.bed_sorted | tail -n 1000 > myfile.bed.$i.$j.bed
done
done
각 파일에 대해이 작업을 수행하는 데 거의 6 시간이 걸립니다. 나는 그들 중 150 명 정도가 운동을해야한다. 이것에 대한 더 빠른 해결책이 있습니까?
내가 가지고있는 데이터 샘플 (myfile.bed_sorted) :
chr1 111763899 111766405 peak1424 1000 . 3224.030 -1 -1
chr1 144533459 144534584 peak1537 998 . 3219.260 -1 -1
chr8 42149384 42151246 peak30658 998 . 3217.620 -1 -1
chr2 70369299 70370655 peak16886 996 . 3211.600 -1 -1
chr8 11348914 11352994 peak30334 990 . 3194.180 -1 -1
chr21 26828820 26830352 peak19503 988 . 3187.820 -1 -1
chr16 68789901 68791150 peak11894 988 . 3187.360 -1 -1
chr6 11458964 11462245 peak26362 983 . 3169.750 -1 -1
chr1 235113793 235117308 peak2894 982 . 3166.000 -1 -1
chr6 16419968 16422194 peak26522 979 . 3158.520 -1 -1
chr6 315344 321339 peak26159 978 . 3156.320 -1 -1
chr1 111756584 111759633 peak1421 964 . 3110.520 -1 -1
chrX 12995098 12997685 peak33121 961 . 3100.000 -1 -1
chr9 37408601 37410262 peak32066 961 . 3100.000 -1 -1
chr9 132648603 132651523 peak32810 961 . 3100.000 -1 -1
chr8 146103178 146104943 peak31706 961 . 3100.000 -1 -1
chr8 135611963 135614649 peak31592 961 . 3100.000 -1 -1
chr8 128312253 128315935 peak31469 961 . 3100.000 -1 -1
chr8 128221486 128223644 peak31465 961 . 3100.000 -1 -1
chr8 101510621 101514237 peak31185 961 . 3100.000 -1 -1
chr8 101504210 101508005 peak31184 961 . 3100.000 -1 -1
chr7 8173062 8174642 peak28743 961 . 3100.000 -1 -1
chr7 5563424 5570618 peak28669 961 . 3100.000 -1 -1
chr7 55600455 55603724 peak29192 961 . 3100.000 -1 -1
chr7 35767878 35770820 peak28976 961 . 3100.000 -1 -1
chr7 28518260 28519837 peak28923 961 . 3100.000 -1 -1
chr7 104652502 104654747 peak29684 961 . 3100.000 -1 -1
chr6 6586316 6590136 peak26279 961 . 3100.000 -1 -1
chr6 52362185 52364270 peak27366 961 . 3100.000 -1 -1
chr6 407805 413348 peak26180 961 . 3100.000 -1 -1
chr6 32936987 32941352 peak26978 961 . 3100.000 -1 -1
chr6 226477 229964 peak26144 961 . 3100.000 -1 -1
chr6 157017923 157020836 peak28371 961 . 3100.000 -1 -1
chr6 137422769 137425128 peak28064 961 . 3100.000 -1 -1
chr5 149789084 149793727 peak25705 961 . 3100.000 -1 -1
chr5 149778033 149783125 peak25702 961 . 3100.000 -1 -1
chr5 149183766 149185906 peak25695 961 . 3100.000 -1 -1
head여기에 사용 했습니다.
sort -R"무작위 키 해시"를 사용합니다. 해시를 만드는 것은 총 시간 낭비이며 아마도 다른 것보다 오래 걸릴 것입니다. 행을 배열로 읽어서 색인을 사용하여 섞는 것이 좋습니다. 개인적으로 나는 그것을 사용할 것 perl입니다. 당신은 그것을 할 수 bash있지만 난수를 생성하는 함수가 필요합니다.
perl사람이 아니다 ! 도와주세요.
shuf대신 sort -R이 상당히 빠릅니다. 물론 메모리에서 수행하면 (Perl 답변 참조) 셸에서 전체 파일을 다시 읽어야하는 모든 것을 이길 수 있습니다.
split파일을 각각 1000 줄씩 분할 할 수 있으므로 한 번의 호출로 더 많은 파일을 얻을 수 있습니다sort. 또한 전체 파일을 읽을 필요head가tail없기 때문에 보다 약간 빠른지 확인 했습니까?