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

4行ごとにランダムに1行を選択すると、私の出力は次のようになります。

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行ごとにawkGNUを呼び出すには、shuf次のものが必要です。

awk -v cmd="shuf -n 1" '{print | cmd}; NR % 4 == 0 {close(cmd)}'

ただし、これはファイルの4行ごとに1つのコマンドを実行することを意味し、shこれははるかに効率的ではありません。shuf

関連情報