在公共列上组合两个长度不等的文件,并使用linux命令行

时间:2017-10-18 10:05:28

标签: sql linux bash join awk

我知道有些类似的问题已被提出,但我很难获得awk,加入或其他任何事情来做我想做的事。

我必须以制表符分隔文件。

文件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

每一行都是唯一的,但任何元素都可以在文件中多次出现。这两个文件的行和列数明显不同。

我想要的文件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

列的顺序实际上并不重要。真正的file1有18024188行,而真正的file2有89122313行。 到目前为止我用join或awk做的所有事情都没有像示例中的第二行那样产生一行。我真的不关心使用这两个程序,任何解决方案都适合。如果它会更容易(有人解释我怎么做)我也可以将它转换为sql db并尝试加入它们(我正在尝试一个完整的外连接,对吧?)。

提前致谢

1 个答案:

答案 0 :(得分:2)

使用 awk

file2

左外加入

$ 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