2つの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には次のものが含まれます(ファイルサイズが5 GBを超える)。
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
)。
最初のフィールドにのみ参加する必要がある場合、Michaelのソリューションはうまくいくでしょう。
最初の2つのフィールドを結合する必要がある場合は、次のものを使用できます。
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