ファイルのランダム行を印刷しますが、特定の値の最大数を使用します。

ファイルのランダム行を印刷しますが、特定の値の最大数を使用します。

行をランダムに選択したい入力ファイルがあります。各行には列に値があり、その値の最大数を含む行数をランダムに選択したいと思います。

そのため、作業を簡単にするために、次のテストファイルから始めました。

1 1
2 1
3 1
4 1
5 2
6 2
7 3
8 4
9 4
10 4
11 5
12 5
13 5
14 5
15 5
16 6
17 6
18 7
19 8
20 8

行をランダムに選択したいのですが、2列の各値に対して最大1行だけを選択します。

1 1
6 2
7 3
9 4
13 5
17 6
18 7
19 8

最大行数を選択するために作成したコードは次のとおりです。

#!/bin/bash

for ((i>0;i<8;i++))
do
gawk -v i="${i}" 'BEGIN{n=1} {if (i==$2 && n<=1) {n++;print $0;} if (n>1){next}} ' input >> output
done

任意の行を選択するように拡張するにはどうすればよいですか?

答え1

GNUの場合、sort1は最大値です。

sort -R file | sort -uk2,2

最大値の場合:

sort -R file | awk -v max=2 '++count[$2] <= max' | head -n 8

関連情報