1

我有两个要合并的表格文件,但在此之前我想减少第二个。

第一个文件让我们说 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 做到这一点?

谢谢

4

2 回答 2

1
#!/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 和“类型”的行数之间选择一个随机数来选择要选择的行号。由于该标志,此块仅执行一次。

最后两个块检查每一行的记录号,看看它是否在选取的行号数组中,如果是则打印它。

于 2012-05-26T16:50:50.167 回答
0

这可能对您有用:

grep '^A' file2 | sort -R | head -$(grep -c '^A' file1) >file3
grep '^B' file2 | sort -R | head -$(grep -c '^B' file1) >>file3

注意这假设file1是排序的。

于 2012-05-27T06:45:15.040 回答