質問: 【内容】 コマンドにて、「IDを列挙しているファイル」と、「IDなどが記述されているcsv」を比較し csvから、「IDを列挙しているファイル」に記載されていないIDのレコードを抽出したいです。 【例】 IDを列挙しているファイル(hogehoge_list) ``` AAAAAA XXXXXX ZZZZZZ ``` IDなど様々な情報が記述されているcsv(foofoo.csv) ``` AAAAAA,タイトル,URL BBBBBB,タイトル,URL XXXXXX,タイトル,URL ZZZZZZ,タイトル,URL ``` 「hogehoge_list」と「foofoo.csv」を比較して、「hogehoge_list」にないIDである『BBBBBB』の「foofoo.csv」の行を取得したい。 ``` BBBBBB,タイトル,URL ``` よろしくお願いします。
回答: ``` join -t',' -v2 hogehoge_list foofoo.csv ``` `join` コマンドの `-v` オプションを利用し、一列目で結合されなかった `foofoo.csv` の行のみを出力しています。両ファイルとも対象の列で**ソートされている必要**があります。 ソートなども含めて書くと、例えば以下のようになります。 ``` #!/bin/sh # エラーで即時終了, > (リダイレクト)による上書き禁止 set -eC # join コマンドのため、少なくとも一列目はソートされている必要がある LC_ALL=C sort hogehoge_list -t',' >delete_ids.txt LC_ALL=C sort foofoo.csv -t',' >all.csv LC_ALL=C join -t',' -v2 delete_ids.txt all.csv >out.csv ```