背景
データ量が大きく、Rなどで読み込めない
かつ、sqlのテーブルは作るのめんどくさいなあ と思ってやってみました。
やってみる
aaa.csvから、bbb.csvのなかにidが存在する行だけを抽出します。
(aaa.csvとbbb.csvをINNER JOINします)
こんなデータです
aaa.csv
name | age | id |
---|---|---|
tanaka | 20 | 1 |
ito | 16 | 4 |
yamada | 31 | 6 |
sasaki | 24 | 10 |
bbb.csv
id | name |
---|---|
1 | tanaka |
11 | kondo |
6 | yamada |
1 | tanaka |
13 | ishida |
ソート
まず、joinコマンドを使用するためには、
joinキーがソートされている必要があります。
※aaa.csvのキーは昇順になっているので今回はパス。
csvファイルの3列目を抽出して、ユニークにしてからccc.csvに格納
cut -d "," -f "3" bbb.csv | sort | unique >ccc.csv
cut の -d オプションで区切り文字の指定(csvなので、ここではカンマ)
-f オプションで抽出する列を指定します(左から何列目か)
パイプ(|)でつないで、sortで並び替え、
パイプ(|)でつないで、重複レコードが出ないようユニークにしておきます
こんなデータになったはず
id |
---|
1 |
6 |
11 |
13 |
joinしよう
ソートが完了したのでjoinしましょう。
join -1 3 -2 1 aaa.csv ccc.csv
-1 はひとつめのデータの意味(ここではaaa.csv)の3列目
-2はふたつめのデータの意味(ここではccc.csv)の1列目
こんなデータになった
name | age | id |
---|---|---|
tanaka | 20 | 1 |
yamada | 31 | 6 |
aaa.csvとccc.csvの共通idのものだけ抽出できた!