2017-10-18 52 views
0

我知道一些类似的问题已经被提出,但我很努力地获得awk,join或其他任何东西来执行我想要的操作。在公共列上组合两个不同长度的文件,并使用linux命令行进行多个匹配

我必须制表符分隔文件。

文件1:

Text1 Text2 Text3 

1000 128 128/D59 

1001 116 116/A95 

每一行都是独特的,在第一列中的每一个元素只发生一次。

文件2:

Text1 Text4 Text5 Text6 

1000 1003 19901001 1 

1000 1002 19901001 2 

1001 1003 19971005 0 

每一行是唯一的,但任何元素可以在文件中出现多次。这两个文件有不同数量的rowns和columns。

我想要的文件3:

Text1 Text4 Text5 Text6 Text2 Text3 

1000 1003 19901001 1 128 128/D59 

1000 1002 19901001 2 128 128/D59 

1001 1003 19971005 0 116 116/A95 

列的顺序并不重要的实际。真正的文件1有18024188行,真正的文件2有89122313行。 到目前为止,我通过join或awk所做的所有工作都没有产生像示例中第二个那样的行。我真的不关心使用这两个程序,任何解决方案都适合。如果它会更容易(并且有人解释我如何去做),我也可以将它转换成一个sql数据库并尝试加入它们(我正在尝试一个完整的外连接,对吗?)。

在此先感谢

+1

要澄清的东西:如果要存在于'file2'所有记录,可能会或可能不会是'file1'那么这将是左外连接在'file2'上。如果你想要在两个文件中的所有记录,那么它将是完全外连接,并且各个字段将是空的,这些不存在。你想要什么 ? – batMan

+0

那么这是一个很好的问题:file2中不应该有file1中没有相应记录的记录。所以两个连接都应该导致相同的结果。但是,如果我的数据损坏,我很可能想知道这一点。所以我想我想要一个左外连接,并填充NA或纠正任何行少于6列。编辑:我希望我很清楚。 –

+0

:所以你基本上需要'Inner Join'。检查我更新的答案。 – batMan

回答

2

使用AWK

左外连接文件2

$ awk 'FNR==NR{a[$1]=$2FS$3; next} ($1 in a){print $0,a[$1]; next} {print $0,"NA","NA"}' file1 file2 

Text1 Text4 Text5 Text6 Text2 Text3 

1000 1003 19901001 1 128 128/D59 

1000 1002 19901001 2 128 128/D59 

1001 1003 19971005 0 116 116/A95 

2000 1003 19971005 0 NA NA 

FNR==NR{a[$1]=$2FS$3; next}:要存储的file1内容关联数组a,其中的关键是独特的领域之一

($1 in a){print $0,a[$1]}:在迭代file2时检查数组中是否存在第一个字段/键。如果是,则在记录旁边打印它的值。

如果数组中不存在密钥(例如,2000),则只需打印file2中的记录;这将反映left outer joinfile2上的行为。

内加入两个文件:

$ awk 'FNR==NR{a[$1]=$2FS$3; next} ($1 in a){print $0,a[$1]}' file1 file2 
Text1 Text4 Text5 Text6 Text2 Text3 

1000 1003 19901001 1 128 128/D59 

1000 1002 19901001 2 128 128/D59 

1001 1003 19971005 0 116 116/A95 
+0

谢谢。结果看起来像我想要的。 –

+0

@NicDoe我已经更新了外部以及内部连接的命令。看一看。 – batMan

+1

再次感谢您。现在行数适合,我看到NA是数据被破坏。在file2上的左外部连接做了诀窍。 –

相关问题