【问题标题】:Combine two files with unequal length on common column with multiple matches with linux command line使用linux命令行将公共列上长度不等的两个文件与多个匹配项合并
【发布时间】:2017-10-18 10:05:28
【问题描述】:

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

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

提前致谢

【问题讨论】:

  • 澄清一下:如果您想要file2 中存在的所有可能是或不是file1 的记录,那么它将在file2 上留下外部连接。如果您想要两个文件中的所有记录,那么它将是完全外部连接,并且相应的字段将为空,而这些字段不存在。你想要什么?
  • 这是一个很好的问题:file2 中不应该有在 file1 中没有对应记录的记录。所以两个连接都应该导致相同的结果。但是,如果我的数据已损坏,我很可能想知道这一点。所以我想我想要一个左外连接,并用 NA 填充或更正任何少于 6 列的行。编辑:我希望我很清楚。
  • :所以你基本上需要Inner Join。检查我更新的答案。
  • wc -l file3.仅给出 64975775 行。所以 24146538 行丢失了。显然我有一些约会问题。所以我似乎需要一个左外连接作为找到问题的起点。编辑:还没有看到蝙蝠侠的答案。

标签: sql linux bash join awk


【解决方案1】:

使用 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 join 在file2 上的行为。

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

【讨论】:

  • 谢谢。结果看起来像我想要的。
  • @NicDoe 我已经更新了外连接和内连接的命令。看看吧。
  • 再次感谢您。现在行数适合,我看到 NA 是数据被破坏了。 file2 上的左外连接起到了作用。
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多