1

2 つの CSV ファイルがあります。1.csvfiles には 718 のエントリがあり、2.csv68000 のエントリがあります。

#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 つの column( Names) しか使用できない場合に 2 つのファイルを比較し、一致するnames.

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

ここで確認したいのですが、 in がNumin1.csvと一致する場合、一致しNumた両方のファイル 2.csvから関連付けられた「名前」は何 ですか?csvNum

Result : 

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

を使用してこれを達成する方法はcomm

4

2 に答える 2

2

コマンドを使用joinして、最初のフィールド、つまり数値で 2 つの csv ファイルに対して内部結合を実行できます。次に例を示します。

$ 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
$

いくつかのダミー行 (6 番と 7 番) を追加したことに注意してください。また、両方のファイルに存在しないため、出力に表示されていないことにも注意してください。

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

于 2016-05-02T09:58:05.817 に答える
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複数のスペースを 1 つのスペースにまとめ、カンマ ( ,)で置き換えます。

于 2016-05-02T10:02:48.947 に答える