2011-08-09 10 views
1

2つの大きな未ソートの.csvファイルを列1と3に基づいて比較したタスクです。 各ファイルには約200KBのレコードが含まれています。出力に関しては、第1のファイルには第1列と第3列に基づくレコードが存在し、第2のファイルには存在しないレコードを知る必要があります。ファイルはカンマ区切りの値ファイルで引用されます。列3は比較の際に大文字小文字を無視する必要があります。2列に基づく2つの大きなソートされていないCSVファイルの比較

例ファイル1:

"id", "name", "email", "country" 
"1233", "jake", "[email protected]", "USA" 
"2345", "alison", "[email protected]", "Canada" 
"3456", "jacob", "[email protected]", "USA" 
"5678", "natalia", "[email protected]", "USA" 

ファイル2

"id", "name", "email", "country" 
"2345", "alison", "[email protected]", "Canada" 
"3456", "jacob", "[email protected]", "USA" 
"5690", "lina", "[email protected]", "Canada" 

所望の出力ファイル

"5678", "natalia", "[email protected]", "USA" 

コードの例は非常に高く評価されるだろう。

+0

言語とどのようなあなたがこれまでに行われ、問題が何ですか? – Mark

+0

なぜ "1233"、 "jake"、 "[email protected]"、 "USA" 'という行は出力に表示されませんか? – brandizzi

+0

こんにちはマーク、私はハッシュマップで、Javaを試して、それは非常に遅いでした。 – Tanya

答えて

1

試してみてください。どのように動作

join -v 1 -i -t, -1 1 -2 1 -o 1.2 1.3 1.4 1.5 <(awk -F, '{print $1":"$3","$0}' f1.txt | sort) <(awk -F, '{print $1":"$3","$0}' f2.txt | sort) 

は:

1)私は最初のカラム1とカラム3接合することで、複合キーの列を作成します。

awk -F, '{print $1":"$3","$0}' f1.txt 
awk -F, '{print $1":"$3","$0}' f2.txt 

2)をソート両方のI出力:

awk -F, '{print $1":"$3","$0}' f1.txt | sort 
awk -F, '{print $1":"$3","$0}' f2.txt | sort 

3)私は、最初の列に参加するためにjoinコマンドを使用します(私の複合キー)と出力組にならない行はファイルから1

出力:

"1233", "jake", "[email protected]", "USA" 
"5678", "natalia", "[email protected]", "USA" 
+0

+1カラム3は大文字と小文字を区別しないと思われるので、代わりに 'tolower($ 3)'が必要です。 –

+1

@ glenn-jackman私は 'join -i'を使って大文字小文字を無視しています。 – dogbane

+0

awkコマンドはチャームのように機能しますが、結合には不満があります1)-iは有効なオプションではありません GNU bash、version 3.2.48(1)-release(x86_64-apple-darwin10.0) 著作権(C)2007フリーソフトウェア財団、Inc. – Tanya

0

ファイルをループし、2つの配列(またはおそらくはハッシュ)にロードし、2番目のファイルをループし、各行を配列します。 array1[n]array2[n]が現在の行の配列にない場合は、missingとして出力します。私はこの作業にPerlを使用します。

+0

ファイルが大きいです。それらを配列にロードすることは賢明ではありません。 – dogbane

+0

次に、ベースファイルの各行について、2行目のファイルを1行ずつ検索します。速くはないが、memの問題にぶつからない。 – atrain

0
awk 'BEGIN { FS="\", \""} 
    FNR == 1 {read++;} 
    FNR !=1 {if (read==1) {store[$1","tolower($3)] = $0} if (read==2) {delete store[$1","tolower($3)]}} 
    END {for (i in store) {print store[i]}}' file1 file2 

出力:

"1233", "jake", "[email protected]", "USA" 
"5678", "natalia", "[email protected]", "USA" 
0

たとえば、メモリ内のデータベースにファイルの内容をロードします。 H2と参加

0
awk 'BEGIN { FS=OFS=","}; NR==FNR{a[tolower($1$3)]=++i;next} { if (tolower($1$3) in a);else {print } }' file2 file1 

出力とSQLの選択を使用します。

"1233", "jake", "[email protected]", "USA" 
"5678", "natalia", "[email protected]", "USA"