Sql 使用linux命令行将公共列上长度不等的两个文件与多个匹配项组合在一起

Sql 使用linux命令行将公共列上长度不等的两个文件与多个匹配项组合在一起,sql,linux,bash,join,awk,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 每一行都是唯一的,但任何元素都可以在文

我知道有人问过一些类似的问题,但我很难得到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
列的顺序实际上并不重要。实际文件1有18024188行,实际文件2有89122313行。 到目前为止,我对join或awk所做的一切都没有产生与示例中的第二行类似的行。我真的不在乎使用这两个程序,任何解决方案都适合。如果这会更容易(有人向我解释如何做),我也可以将其转换为sql db并尝试加入它们(我正在尝试完全外部连接,对吗?)


使用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}
:在关联数组
a
中存储
file1
的内容,其中键是唯一字段1

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

如果数组中不存在键(例如,
2000
),则只需打印
file2
中的记录即可;这将反映
文件2
上的
左侧外部联接的行为

两个文件上的内部联接

$ 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

使用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}
:在关联数组
a
中存储
file1
的内容,其中键是唯一字段1

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

如果数组中不存在键(例如,
2000
),则只需打印
file2
中的记录即可;这将反映
文件2
上的
左侧外部联接的行为

两个文件上的内部联接

$ 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

澄清一下:如果您希望
file2
中存在的所有记录可能是
file1
,也可能不是
file1
,那么它将保留在
file2
上的外部连接。如果您想要两个文件中的所有记录,那么它将是完整的外部联接,并且相应的字段将为空,不存在。你想要什么?这是个好问题:文件2中不应该有任何记录在文件1中没有相应的记录。因此,两个联接应导致相同的结果。然而,如果我的数据被破坏,我很可能想知道这一点。所以我想我需要一个左外连接,并用NA填充或更正任何少于6列的行。编辑:我希望我说的很清楚:所以你基本上需要
内部连接。检查我更新的answer.wc-l文件3。仅给出64975775行。所以24146538行丢失了。显然我有一些约会的问题。所以我似乎需要一个左外连接作为发现问题的起点。编辑:还没有看到蝙蝠侠的答案。澄清一点:如果你想要
file2
中存在的所有记录,它们可能是
file1
,也可能不是
file2
,那么它将留在
file2
上的外部连接。如果您想要两个文件中的所有记录,那么它将是完整的外部联接,并且相应的字段将为空,不存在。你想要什么?这是个好问题:文件2中不应该有任何记录在文件1中没有相应的记录。因此,两个联接应导致相同的结果。然而,如果我的数据被破坏,我很可能想知道这一点。所以我想我需要一个左外连接,并用NA填充或更正任何少于6列的行。编辑:我希望我说的很清楚:所以你基本上需要
内部连接。检查我更新的answer.wc-l文件3。仅给出64975775行。所以24146538行丢失了。显然我有一些约会的问题。所以我似乎需要一个左外连接作为发现问题的起点。编辑:还没有看到蝙蝠侠的答案。谢谢。结果看起来像是我想要得到的。@NicDoe我已经更新了用于外部连接和内部连接的命令。看一看,再次谢谢你。现在行数符合,我看到数据被破坏了。文件2上的左外部联接成功了。谢谢。结果看起来像是我想要得到的。@NicDoe我已经更新了用于外部连接和内部连接的命令。看一看,再次谢谢你。现在行数符合,我看到数据被破坏了。file2上的左外部联接成功了。