sql - 将公共(public)列上长度不等的两个文件与 linux 命令行进行多次匹配

标签 sql linux bash join awk

我知道有人问过一些类似的问题,但我很难获得 awk、join 或其他任何东西来做我想做的事。

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

文件 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 数据库并尝试加入它们(我正在尝试一个完整的外部连接,对吧?)。

提前致谢

最佳答案

使用awk

file2 上的

Left Outer Join

$ 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 中,其中键是唯一字段 one

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

如果数组中不存在键(例如。2000),则只打印file2中的记录;这将反射(reflect) file2left outer join 的行为。

Inner Join 两个文件:

$ 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

关于sql - 将公共(public)列上长度不等的两个文件与 linux 命令行进行多次匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46807640/

相关文章:

c - 使用信号量时等待 fork 进程

php - 将多个var值插入到同一个mysql表中

php - 请帮助我使用 php trim 函数

php - 在 MYSQL 中使用单个查询获取 3 个不同 SUM 的 "best"方法是什么

r - 是否有更改文件所有权的 R 函数?

bash - 在 VIM 中对单词(而不是行)进行排序

sql - 将平均值添加到 PostgreSQL 中每个组的列

linux - linux下如何自动创建目录?

linux - 如何在启动时运行两个shell脚本?

php - 从 php 启动一个独立进程(通过 httpd)