<p>如果你不想改变原始数据,你可以将一个索引数组随机移动到包含这些行的数组中,然后对前5组300行做任何你想做的事情,然后从剩下的部分中删除它们。在</p>
<p>例如,使用30行输入(数字1->30)而不是3000行:</p>
<pre><code>$ cat tst.awk
function shuf(array, i, j, t) {
# Shuffles an array indexed by numbers from 1 to its length
# Copied from https://www.rosettacode.org/wiki/Knuth_shuffle#AWK
for (i=length(array); i > 1; i ) {
# j = random integer from 1 to i
j = int(i * rand()) + 1
# swap array[i], array[j]
t = array[i]
array[i] = array[j]
array[j] = t
}
}
{ arr[NR] = $0 }
END {
srand()
shuf(arr)
numBlocks = 5
pct10 = length(arr) * 0.1
for (i=1; i<=numBlocks; i++) {
print " - Block", i
for (j=1; j<=pct10; j++) {
print ++c, arr[c]
delete arr[c]
}
}
print "\n - Remaining"
for (i in arr) {
print i, arr[i]
}
}
</code></pre>
<p>一。在</p>
^{pr2}$
<p>再次证明输出是随机的:</p>
<pre><code>$ seq 30 | awk -f tst.awk
- Block 1
1 17
2 15
3 22
- Block 2
4 19
5 1
6 13
- Block 3
7 7
8 10
9 28
- Block 4
10 5
11 2
12 8
- Block 5
13 16
14 11
15 30
- Remaining
16 14
17 18
18 26
19 4
20 29
21 12
22 21
23 27
24 3
25 24
26 6
27 9
28 23
29 20
30 25
</code></pre>