![在 N 行的每个块中随机选择一行](https://linux22.com/image/121913/%E5%9C%A8%20N%20%E8%A1%8C%E7%9A%84%E6%AF%8F%E4%B8%AA%E5%9D%97%E4%B8%AD%E9%9A%8F%E6%9C%BA%E9%80%89%E6%8B%A9%E4%B8%80%E8%A1%8C%20.png)
我想在给定行数之后随机选择一行。例如,这是我的输入:
8 blue
8 red
8 yellow
8 orange
3 pink
3 white
3 cyan
3 purple
1 magenta
1 black
1 green
1 brown
并且从每四行中随机选择一行,我的输出将是:
8 orange
3 pink
1 green
我想出的最好的办法是:
awk '!(NR%4){a=NR+4};NR<=a|"shuf -n 1"'
但它不起作用。
答案1
随着 GNU 的实现split
命令:
split -l 4 --filter='shuf -n1' inputfile
-l N
-N
每个输出文件放置行/记录--filter=COMMAND
- 写入外壳COMMAND
;文件名是$FILE
答案2
从每 n=4 行中随机选择 p=1 行:
awk -v n=1000 -v p=50 '
BEGIN {srand(); remaining = p}
NR > n {remaining = p; NR = 1}
rand()*(n + 1 - NR) < remaining {
print; remaining--
}' < your-file
要每 4 行awk
调用一次 GNU shuf
,您需要:
awk -v cmd="shuf -n 1" '{print | cmd}; NR % 4 == 0 {close(cmd)}'
但这意味着每 4 行文件运行一个sh
和一个命令,效率会低很多。shuf