使用联接在 AWK 中对记录进行叉积
Cross product of records in AWK using Joins
我有一个包含 1994 条记录和 13 个字段的数据集。我正在尝试获取以下数据集的叉积:
数据集
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13
1 2 5 6 7 3 1 8 5 9 7 3 4
2 4 . . . . . . . . . . .
3 9 . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
1994 . . . . . . . . . . . .
叉积的输出将是数据集中的每条记录与数据集中的所有其他记录并行(在连续列中)。如下图所示:
预期输出
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 c22 c23 c24 c25 c26
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
当我执行代码时:join file{,} -j99
我得到了一个在另一个下面的叉积记录。
如果我对少于 10 条的记录应用相同的代码,那么输出就是预期的。我尝试将 -j 的值更改为 99999 和 9999999 但输出没有变化。
我得到的输出为:
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13
. . . . . . . . . . . . .
. . . . . . . . . . . . .
所以,我有 1994 条记录,我应该得到:1994*1994 = 3,976,036,但我得到了这些行的两倍,因为记录是一个在另一个下面。
交叉连接是每一行对应每一行。所以告诉 awk 在每一行旁边打印整个文件。像
#!/usr/bin/awk -f
{
cmd = "awk -v LINE='" [=10=] "' " "'{ printf(\"%s\t%s\n\", LINE, [=10=]) }' " \
FILENAME
system(cmd)
}
但我绝不会这样做。它效率低下,调用 awk O(N) 次,而且它不会给你太多帮助。我将该文件导入到 SQLite 中,并使用交叉连接为我提供 where
子句和命名列。
我有一个包含 1994 条记录和 13 个字段的数据集。我正在尝试获取以下数据集的叉积:
数据集
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13
1 2 5 6 7 3 1 8 5 9 7 3 4
2 4 . . . . . . . . . . .
3 9 . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
1994 . . . . . . . . . . . .
叉积的输出将是数据集中的每条记录与数据集中的所有其他记录并行(在连续列中)。如下图所示:
预期输出
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 c22 c23 c24 c25 c26
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
当我执行代码时:join file{,} -j99
我得到了一个在另一个下面的叉积记录。
如果我对少于 10 条的记录应用相同的代码,那么输出就是预期的。我尝试将 -j 的值更改为 99999 和 9999999 但输出没有变化。
我得到的输出为:
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13
. . . . . . . . . . . . .
. . . . . . . . . . . . .
所以,我有 1994 条记录,我应该得到:1994*1994 = 3,976,036,但我得到了这些行的两倍,因为记录是一个在另一个下面。
交叉连接是每一行对应每一行。所以告诉 awk 在每一行旁边打印整个文件。像
#!/usr/bin/awk -f
{
cmd = "awk -v LINE='" [=10=] "' " "'{ printf(\"%s\t%s\n\", LINE, [=10=]) }' " \
FILENAME
system(cmd)
}
但我绝不会这样做。它效率低下,调用 awk O(N) 次,而且它不会给你太多帮助。我将该文件导入到 SQLite 中,并使用交叉连接为我提供 where
子句和命名列。