根据条件合并两个 csv 文件

根据条件合并两个 csv 文件

我有两个 csv 文件,假设 A.csv 和 B.csv A.csv 包含(文件大小超过 5GB)

64.234     20.342   786
63.231     20.124   765
63.652     20.857    387

B.csv包含(文件大小大于5GB)

  63.231   20.124    234
  63.652   20.857    383
  64.234   20.342    876

我想要最终文件,例如

    64.234    20.342     786   876
    63.231    20.124     765    234
    63.652     20.857     387    383

经度和纬度将用于条件当经度和纬度相等时,将存储带值是否有任何快速解决方案,通过使用 sed、脚本或任何工具...!!!!

答案1

由于输入文件未排序,因此没有快速解决您的问题的方法。不过,你可以这样做:

join -o 0,1.2,1.3,2.3 <(sort A.csv) <(sort B.csv)

答案2

尽管关于应使用哪些字段进行连接的问题并不精确 - 它看起来像是 field1 和 field2 (拼写错误A.csv field2=20.875而不是20.857)。

如果您只需要加入第一个字段,迈克尔的解决方案就可以。
如果您需要加入前两个字段,您可以使用:

join <(sed -e 's/  */:/' a.csv | sort) <(sed -e 's/  */:/' b.csv | sort)

(如果字段不只用空格分隔,您可能需要调整 sed 正则表达式)。 Rakesh 的解决方案效率相当低,因为它同时扫描A.csvB.csv中的每一行A.csv

答案3

有了这么多数据,您应该考虑将数据导入数据库,在(纬度,经度)上创建索引,然后您可以获得结果

select a.latitude, a.longitude, a.value, b.value
from a, b
where a.latitude  = b.latitude
  and a.longitude = b.longitude;

答案4

尝试一下这个:

for i in `awk '{print $1}' A.csv`;
 do
         t1=`awk -v a="$i" '$1==a {print $3}' A.csv`;
         awk -F' ' -v a="$i" -v b="$t1" '$1==a {print $1" "$2" "$3" " b }' B.csv;
 done

相关内容