#!/bin/bash
read -r acount bcount <<< $(csplit file2 '/^B /')
awk -v "acount=$acount" -v "bcount=$bcount" '
NR == FNR {
arr[$1]++;
next
}
! setup {
setup = 1
while (arandcount < acount) {
line = int(rand() * acount) + 1
if (! alines[line]) {
alines[line] = 1
arandcount++
}
}
while (brandcount < bcount) {
line = int(rand() * bcount) + 1
if (! blines[line]) {
blines[line] = 1
brandcount++
}
}
}
FILENAME == "xx00" && FNR in alines {
print
}
FILENAME == "xx01" && FNR in blines {
print
}' file1 xx00 xx01
「xx00」と「xx01」は、によって作成されたファイルの名前ですcsplit
。
このcsplit
コマンドは、入力ファイルを正規表現で分割し、各出力ファイルの行数を出力します。このread
コマンドは、それらのカウントを変数に入れます。変数は AWK プログラムに渡されます。
最初のブロックは、file1 のすべての行を読み取り、各「タイプ」(A または B) をカウントします。
2 番目のブロックは、1 から「タイプ」の行数までの乱数を選択して、選択する行番号を選択します。このブロックは、フラグのために一度だけ実行されます。
最後の 2 つのブロックは、各行のレコード番号をチェックして、選択された行番号の配列にあるかどうかを確認し、ある場合は出力します。