- ベストアンサー
csvファイルの1カラム目に重複行があればその行全体を削除するには?
次のようなファイルがあった場合、 1, 2, 3 1, 3, 5 2, 4, 7 3, 1, 0 3, 1, 2 3, 7, 1 4, 0, 0 5, 0, 0 1カラム目が重複する行を検索して、該当する行全体を削除し、(最初に見つかった行はそのままで、それ以降の重複行は削除したい)次のようなファイルにする場合は、どのようなコマンド、スクリプト作成すればよいでしょうか? 1, 2, 3 2, 4, 7 3, 1, 0 4, 0, 0 5, 0, 0
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。データは第1カラムでソートしてあるとして、 uniq(ユニーク)コマンド単体でもいけます。 $ uniq -w 1 csvfile GNU uniq の場合、「-w N」または「--check-chars=N」(N は数字) オプションを使えば、(他のオプションでフィールドや文字のスキップをした後の) 先頭から N 文字までしか比較しません。 N には第1カラムの最大文字数を指定してください。詳しくは man uniq で。
その他の回答 (3)
- tatsu99
- ベストアンサー率52% (391/751)
もし、perlでよければ、以下のようなスクリプトを作成してください。 --------------------------------------- while(<>){ ($col1) = split(/,/); if ($data{$col1}) {next;} $data{$col1} = 1; print ; } --------------------------------------- perl このスクリプト名 入力データファイル > 出力データファイル とすると、出力データファイルに結果が書き込まれます。
- chie65536
- ベストアンサー率41% (2512/6032)
Microsoft Accessをお持ちであれば、MDBに読み込ませるのが手っ取り早いでしょう。 Accessで空のDBを作り、必要な数の文字列項目を持ったテーブルを作り、先頭の項目のみ「インディックス付き、重複を許さない」にしておきます。 次に、CSVファイルを作っておいたテーブルにインポートします。すると、先頭項目が重複を許していないので、重複したレコードが捨てられます。(捨てられた重複レコードは「インポートエラー」と言うテーブルに保存されます) そして、そのテーブルをエクスポートしてCSV形式で保存すれば、目的を達する事が出来ます。
DAOでも、ADO + Jet OLEでも、一応CSVは操作できるのですが、操作性を考えると、MDBなり、MSDEなりに一度読み込んで、RDB上でデータを加工してからCSVを再出力したほうが早いような気がします。 急がば回れ、ということで........。