在 N 行的每个块中随机选择一行

在 N 行的每个块中随机选择一行

我想在给定行数之后随机选择一行。例如,这是我的输入:

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

相关内容