-1

当我使用命令对 file.txt > file2.txt 中的记录进行交叉乘积时:

join file1.txt{,} -j999 > file2.txt

我得到 file1.txt 中的每条记录以及 file1.txt 中的所有记录,例如:

样本数据集

r1
r2
r3

我明白了

r1 r1
r1 r2
r1 r3
r2 r1
r2 r2
r2 r3
r3 r1
r3 r2
r3 r3

我不想要 r1 r1、r2 r2、记录等等...

如果在做交叉产品时它可能是正确的,我如何获得预期的结果?如果没有,如何在处理 join file1.txt{,} -j 999 后删除记录

我用另一个 awk 命令尝试了这个:

if($i!=$(i+12)){print $0;} and

if($1!=$13){print $0;}

因为我有每条记录的序列号 1,2,3,... 我有 file2.txt 为:

c1  c13 --> column 1 and column 13
1   1
1   2
1   3
1   4
2   1
2   2
2   3
2   4
3   1
3   2
3   3
3   4

我只是比较序列号,如果它们不相等,则打印这些记录。但我得到了不希望的结果,例如:

1  2
1  3
1  4
2  3
2  4
3  4

您可以看到它跳过了 $1!=$13 之前的所有记录。所以缺少行,例如:

2  1
3  1
3  2

它应该只跳过模式 r1 r1, r2 r2,... 中的记录

更新

图片

第 1 列和第 13 列是序列号。

4

1 回答 1

1

只需在文件中循环两次:

awk 'FNR==NR {a[FNR]=$0; next}
     BEGINFILE{lines=NR-FNR}
     {
       for (i=1;i<=lines;i++) {
           if (i!=FNR) print $0, a[i]
       }
     }' file file

a[line_number]=value_on_that_line这在第一次读取时将数据存储在数组中。然后,当第二次读取时,它只会循环打印所有对的行数,除非行号与索引匹配 - 即当它们映射到同一行时。

对于带有 r1, r2, r3 的给定文件,它返回:

$ awk 'FNR==NR {a[FNR]=$0; next} BEGINFILE{lines=NR-FNR} {for (i=1;i<=lines;i++) { if (i!=FNR) print $0, a[i]}}' f f
r1 r2
r1 r3
r2 r1
r2 r3
r3 r1
r3 r2
于 2016-06-20T11:39:57.493 回答