条件に応じて2つのCSVファイルをマージします。

条件に応じて2つのCSVファイルをマージします。

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.csvA.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

関連情報