我有两个 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.csv
和B.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