2016-05-02 11 views
1

私は2つのCSVファイルを持っています。 1.csvファイルには718個のエントリがあり、2.csvには68000個のエントリがあります。Unix Compare通信を使用して2つのCSVファイル

#cat 1.csv 
#Num #Name 
1  BoB 
2  Jack 
3  John 
4  Hawk 
5  Scot 
........... 

#cat 2.csv 
#Num #Name 
1 BoB 
2 John 
3 Linda 
4 Hawk 
5 Scot 
........ 

私は1つの列のみ(Namesが)の両方で利用可能であるとき、2つのファイルを比較する方法を知っていたとのマッチングnamesを取得します。 1.csvNum2.csvNumとのマッチングされている場合は

#comm -12 <(sort 1.csv) <(sort 2.csv) 

今私は、チェックしたいと思い、その一致したNumためcsvファイルの両方から関連する「名前」とは何ですか?

Result : 

1,Bob,Bob 
2,Jack,John 
3,John,Linda 
4,Hawk,Hawk 
5,Scot,Scot 
.......... 

これを達成するにはcommを使用する方法?

答えて

2

joinコマンドを使用して、1つ目のフィールド、つまり番号の2つのcsvファイルに対して内部結合を実行できます。ここでは一例です:私はいくつかのダミー行(番号6および7)を添加しても、彼らは両方のファイルに存在しないとして、彼らは出力に登場していないことに注意している

$ cat f1.csv 
1  BoB 
2  Jack 
3  John 
4  Hawk 
5  Scot 
6  ExtraInF1 
$ cat f2.csv 
1 BoB 
3 Linda 
4 Hawk 
2 John 
5 Scot 
7 ExtraInF2 
$ join <(sort -t ' ' -k 1 f1.csv) <(sort -t ' ' -k 1 f2.csv) 
1 BoB BoB 
2 Jack John 
3 John Linda 
4 Hawk Hawk 
5 Scot Scot 
$ join <(sort -t ' ' -k 1 f1.csv) <(sort -t ' ' -k 1 f2.csv) | tr -s ' ' , 
1,BoB,BoB 
2,Jack,John 
3,John,Linda 
4,Hawk,Hawk 
5,Scot,Scot 
$ 

注意。

<(sort -t ' ' -k 1 f1.csv)は、プロセス置換を意味します。つまり、この場所のプロセス出力を置き換えます。区切り文字がスペース(-t ' ')で、第1キーの第1列(-k 1)とjoinがデフォルトで両方のファイルの第1列で内部結合を実行するsort

+0

'民を有する場合に適していますソート済みの場合は更新してください! – Inian

+1

@Inian fixed it – ritesht93

1

joinコマンド

join -1 1 -2 1 <(sort 1.csv) <(sort 2.csv) | tr -s ' ' , 

-1 2 : sort on file 1, 1st field 
-2 1 : sort on file 2, 1st field 

tr -sは単一のスペースに複数のスペースを圧迫し、コンマ(,)によってそれを置き換えるを使用して、内部結合のための別の一ライナーは

関連する問題