#!/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)。
第二个块通过在 1 和“类型”的行数之间选择一个随机数来选择要选择的行号。由于该标志,此块仅执行一次。
最后两个块检查每一行的记录号,看看它是否在选取的行号数组中,如果是则打印它。