Tôi cần sắp xếp một bed
tệp ngẫu nhiên 10000 lần và lấy 1000 hàng hàng đầu mỗi lần. Hiện tại, tôi đang sử dụng đoạn mã sau:
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
Phải mất gần 6 giờ để làm điều này cho mỗi tệp. Tôi có khoảng 150 người trong số họ sẽ được giải quyết. Có một giải pháp nhanh hơn cho việc này?
Một mẫu dữ liệu (myfile.bed_sort) tôi có:
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
ở đây.
sort -R
sử dụng "hàm băm ngẫu nhiên". Tạo băm là một sự lãng phí hoàn toàn thời gian và có thể mất nhiều thời gian hơn bất cứ điều gì khác. Sẽ tốt hơn nếu đọc các dòng thành một mảng và sau đó xáo trộn bằng cách sử dụng các chỉ mục. Cá nhân, tôi sẽ sử dụng perl
cho điều đó; bạn có thể làm điều đó với bash
nhưng bạn sẽ cần một hàm để tạo các số ngẫu nhiên.
perl
người! Ông có thể giúp tôi không?
shuf
thay vì sort -R
, nó nhanh hơn đáng kể. Tất nhiên, thực hiện nó trong bộ nhớ (xem câu trả lời của Perl) sẽ đánh bại bất cứ thứ gì yêu cầu đọc lại toàn bộ tệp trong trình bao.
split
có thể, sai, chia một tệp thành 1000 dòng mỗi dòng, do đó bạn sẽ nhận được nhiều tệp hơn trong một cuộc gọisort
. Ngoài ra, bạn đã kiểm tra nếuhead
nhanh hơn một chút so vớitail
vì nó không cần phải đọc qua toàn bộ tệp?