• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.4

こんにちは。データは第1カラムでソートしてあるとして、 uniq(ユニーク)コマンド単体でもいけます。 $ uniq -w 1 csvfile GNU uniq の場合、「-w N」または「--check-chars=N」(N は数字) オプションを使えば、(他のオプションでフィールドや文字のスキップをした後の) 先頭から N 文字までしか比較しません。 N には第1カラムの最大文字数を指定してください。詳しくは man uniq で。

参考URL:
http://www.linux.or.jp/JM/html/gnumaniak/man1/uniq.1.html

その他の回答 (3)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

もし、perlでよければ、以下のようなスクリプトを作成してください。 --------------------------------------- while(<>){ ($col1) = split(/,/); if ($data{$col1}) {next;} $data{$col1} = 1; print ; } --------------------------------------- perl このスクリプト名 入力データファイル > 出力データファイル とすると、出力データファイルに結果が書き込まれます。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

Microsoft Accessをお持ちであれば、MDBに読み込ませるのが手っ取り早いでしょう。 Accessで空のDBを作り、必要な数の文字列項目を持ったテーブルを作り、先頭の項目のみ「インディックス付き、重複を許さない」にしておきます。 次に、CSVファイルを作っておいたテーブルにインポートします。すると、先頭項目が重複を許していないので、重複したレコードが捨てられます。(捨てられた重複レコードは「インポートエラー」と言うテーブルに保存されます) そして、そのテーブルをエクスポートしてCSV形式で保存すれば、目的を達する事が出来ます。

noname#5584
noname#5584
回答No.1

DAOでも、ADO + Jet OLEでも、一応CSVは操作できるのですが、操作性を考えると、MDBなり、MSDEなりに一度読み込んで、RDB上でデータを加工してからCSVを再出力したほうが早いような気がします。 急がば回れ、ということで........。