我有两个要合并的表格文件,但在此之前我想减少第二个。
第一个文件让我们说 File1 是表格的,就像这样
A 67 98 56
A 22 29 62
A 11 99 28
B 37 88 14
B 33 99 65
我们有 3 行 A 和 2 行 B
File2 在 A 和 B 之间包含 3000 行,我想从 File2 中随机选择行,但 A 和 B 的数量与 File1 完全相同,这意味着只有 3 个随机行与 A 和两个与 B
任何人都知道如何用 awk 做到这一点?
谢谢
我有两个要合并的表格文件,但在此之前我想减少第二个。
第一个文件让我们说 File1 是表格的,就像这样
A 67 98 56
A 22 29 62
A 11 99 28
B 37 88 14
B 33 99 65
我们有 3 行 A 和 2 行 B
File2 在 A 和 B 之间包含 3000 行,我想从 File2 中随机选择行,但 A 和 B 的数量与 File1 完全相同,这意味着只有 3 个随机行与 A 和两个与 B
任何人都知道如何用 awk 做到这一点?
谢谢
#!/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 和“类型”的行数之间选择一个随机数来选择要选择的行号。由于该标志,此块仅执行一次。
最后两个块检查每一行的记录号,看看它是否在选取的行号数组中,如果是则打印它。
这可能对您有用:
grep '^A' file2 | sort -R | head -$(grep -c '^A' file1) >file3
grep '^B' file2 | sort -R | head -$(grep -c '^B' file1) >>file3
注意这假设file1是排序的。