私はこのように見える2つのファイルを持っています。両方のファイルは1番目と2番目のフィールドでソートされます。AWK - 2つのファイルをキーと比較し、要約を印刷する(欠落、同じ、異なる)
ファイル
3337312|6dc1d4397108002245c770fa66ee4d7767dcc23e|1
3337313|cb1c00eeccb25ea5a069da63a1b0c2565379ff9c|1
3337318|61a813730578c552b62de5618e1d66b1eb74b4f8|1
3337319|6af3b98f25a6a9b9d887486aefddfb53947bbf1c|1
3337320|1e3126f41f848509efad0b3415b003704377778c|1
ファイルB
3337312|6dc1d4397108002245c770fa66ee4d7767dcc23e|1
3337315|780055f13efffcb4bee115c6cf546af85ac6c0a7|1
3337316|19535297b9913b6bca1796b68505498d5e81b5ed|1
3337318|61a813730578c552b62de5618e1d66b1eb74b4f8|1
3337319|6af3b98f25a6a9b9d887486aefddfb53947bbf1c|1
最初の行がキーである(ID用の複数の行が存在し得ます)。 3つのフィールド、パイプを区切ります。ファイルは約1GBです。私がやりたいのは何
は次のようになり、結果セットを取り戻すされています。ここではそれを実現するSQLコードです
3333 rows in File A
4444 rows in File B
1234 rows are identical
2345 rows are different (aka the 2nd/3rd field are different but the key matches)
111 rows in File A not in File B
222 rows in File B not in File A
、それは私のフォールバックです。
--CREATE TABLE aws_hash_compare (the_filename VARCHAR(100) NOT NULL, switch_id BIGINT, hash_value CHAR(40),the_count TINYINT)
--CREATE UNIQUE CLUSTERED INDEX ucidx__awshashcompare__the_filename__switch_id ON aws_hash_compare(the_filename, switch_id)
DECLARE @mSsql_filename sysname = 'FileA'
DECLARE @mYsql_filename sysname = 'FileB'
SELECT COUNT(*) AS MSSQL FROM aws_hash_compare
WHERE the_filename = @mSsql_filename
SELECT COUNT(*) AS MYSQL FROM aws_hash_compare
WHERE the_filename = @mYsql_filename
SELECT COUNT(*) AS switch_id_match FROM aws_hash_compare mysql
INNER JOIN aws_hash_compare mssql
ON mysql.the_filename = @mYsql_filename
AND mssql.the_filename = @mSsql_filename
AND mysql.switch_id = mssql.switch_id
SELECT COUNT(*) AS complete_match FROM aws_hash_compare mysql
INNER JOIN aws_hash_compare mssql
ON mysql.the_filename = @mYsql_filename
AND mssql.the_filename = @mSsql_filename
AND mysql.switch_id = mssql.switch_id
AND mssql.hash_value = mysql.hash_value
AND mssql.the_count = mysql.the_count
SELECT COUNT(*) AS hash_differences FROM aws_hash_compare mysql
INNER JOIN aws_hash_compare mssql
ON mysql.the_filename = @mYsql_filename
AND mssql.the_filename = @mSsql_filename
AND mysql.switch_id = mssql.switch_id
AND (mssql.hash_value <> mysql.hash_value OR mssql.the_count <> mysql.the_count)
SELECT COUNT(*) AS missing_from_MSSQL FROM aws_hash_compare mysql WHERE the_filename = @mYsql_filename
AND NOT EXISTS (SELECT 1 FROM aws_hash_compare mssql WHERE the_filename = @mSsql_filename
AND mssql.switch_id = mysql.switch_id)
SELECT COUNT(*) AS missing_from_MYSQL FROM aws_hash_compare mssql WHERE the_filename = @mSsql_filename
AND NOT EXISTS (SELECT 1 FROM aws_hash_compare mysql WHERE the_filename = @mYsql_filename
AND mssql.switch_id = mysql.switch_id)
正確に何が必要なのですか。とても感謝しています! – mbourgon
@mbourgon、これは1GBのファイルでどれくらいの時間がかかり、消費されるメモリ量が不思議です。もしできれば、私に知らせてください。 –
そして速度比較対SQL – dawg