我知道有人问过一些类似的问题,但我很难获得 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) file2
上 left 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/