テキストファイル内の行重複を削除する方法

このQ&Aのポイント
  • Windowsのコマンドラインで、テキストファイル内の重複行の削除を行いたい。行全体ではなく、行の一部のみを比較して重複行を削除する方法を探している。
  • 行の一部のみを比較対照として重複行を削除したい。行頭のn文字を比較して重複行を削除する方法を知りたい。
  • AWKやPerlなどのコマンドを使用して行頭のn文字のみを比較対照として重複行を削除する方法を探している。
回答を見る
  • ベストアンサー

行頭のn文字が重複した行を削除したい

Windowsのコマンドラインで、テキストファイル内の重複行の削除を行いたいのですが、行全体ではなく、行の一部のみを比較して重複行を削除出来ないかと考えています。 例えば、以下の様な内容のファイルがあり、 行頭の3文字のみを比較対照とした場合、 -------------------------- aaa1 aaa2 bbb1 bbb2 bbb3 -------------------------- 以下の様な結果にしたいのです。 -------------------------- aaa1 bbb1 -------------------------- AWKやPerl、その他のコマンドでも構いませんので、どなたかご存知の方がおられましたらお教え頂けないでしょうか。

  • kon77
  • お礼率97% (92/94)

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

  • ベストアンサー
回答No.3

こんな感じですか? sort in.txt |gawk "{nstr=substr($0,1,3);if(ostr!=nstr){print $0};ostr=nstr}" sortで元の文字列群を整列させる substrで1文字目から3文字目を抽出 先頭3文字が前の行と異なったら出力する

kon77
質問者

お礼

ご回答ありがとうございます。 お教え頂いたコマンドを実行してみましたところ、バッチリ目的の処理をしてくれました。実際のデータでも思い通りの結果を出力してくれました。大変助かりました。本当にありがとうございました。 ご回答、本当にありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

そこまでの仕様ができているなら, Perl で 先頭 3文字をキーにしたハッシュを作る だけですよね.

kon77
質問者

お礼

ご回答ありがとうございます。 先頭3文字をキーにしたハッシュを作ればいいのですね。 自分はPealの知識がないのですが、今から調べてやってみようと思います。 ご回答、ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

仕様の確認ですが →残すのは先に出てきたもの? →1行前との比較だけでいい? ※たとえば aaa1 bbb1 aaa2 ならaaa2は残る →1行前以外を比較したい場合ソートしてよい?

kon77
質問者

お礼

ご回答ありがとうございます。 「残すのは先に出てきたものか」については、どれが残っても構いません。 「1行前との比較だけでいいか」については、1行前との比較だけではなく、全ての行と比較したいです。 「1行前以外を比較したい場合ソートしてよいか」については、ソートしても構いません。 もし実現可能なようでしたら、宜しくお願い致します。

関連するQ&A

  • 重複 があれば削除して1つに

    http://oshiete1.goo.ne.jp/qa4510771.html の族編です。 エクセルの1列の縦長いデータを抽出して 1行の横長いカンマ区切りのテキストにしたいのですが、 エクセルの縦1列をコピペでワードにテキストで貼り付け そこから改行を置き換え削除で横並び1列になったのですが 重複する文字が複数あったので、重複分を削除して1つだけに残したいのです。 エクセルデータは変更してはいけないので、コピーしかできません。別のエクセルにならコピーしてもかまいません。 手作業では大変な作業ですので、簡単で単純な方法を教えて下さい。 ********************************** aaa  ← エクセルの縦列のデータ bbb  ← ccc aaa ddd bbb ↓ aaa,bbb,ccc,ddd こんな風に重複分だけ削除して1行カンマテキストにしたいのです。 <(_ _)>

  • 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

  • 行頭に//ある行を削除する方法

    いつもお世話になります。 phpで行頭に「//」あるとき、その行を削除する方法です。 php5では、 $FielList = preg_replace('/(\/\/)(.*)(\r\n)/','$3',$FielList); で、できていたのですが、php4のサーバへアップしたら //以降が残ってしまいました。 下の例で、//----コメント の行が残ってしまいます。 $FielListは、以下のようなイメージです。 //----コメント aaa,bbbbbbbbbbbbbbbbbbbbbbbbb ccc,ddddddddddddddddddddddddddd よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Perlを使って、大文字小文字関係なく、重複行を削除したい。

    現在、下記のコードで重複行を削除し、ファイルを作成しているのですが、 AAA aaa AaA などのように大文字、小文字が混じっている場合は重複とはみなさず削除の対象になりません。 こういった場合も重複とみなして削除させたいのですがどのようにすればいいでしょうか? open(IN, "INfilename.txt"); open(OUT, ">Outfilename.txt"); while(){ if(!exists($count{$_})){$count{$_}++;print OUT $_;} } close (IN); close (OUT);

    • ベストアンサー
    • CGI
  • エクセル / 重複する文字の行番号を抜き出す。

    お世話になります。 XP/2003 使用です。 エクセルで下記のようなケースの行番号を抜き出したいです。 できれば、関数のみがありがたいのですが、 マクロでもOKです。 ----------- 抽出したい行番号  重複する文字が入力された 「先頭の行」 と 「最後の行」 の行番号 ----------- 例 同じ列に、重複する単語が入力されています。 重複する単語は、必ず上下に並んでいますが、 1単語のみ場合もあります。 1  AAA 2  AAA 3  AAA 4  AAA 5  BBB 6  BBB 7  CCC 8  CCC 9  CCC 10 DDD 上記の場合の抽出した行番号 単語 → 先頭の行/最後の行 AAA → 1/4 BBB → 5/6 CCC → 7/9 DDD → 10/10 行番号は、B列、C列などに抽出できれば良いです。 何卒よろしくお願いします。

  • C言語で書き込んだファイルの重複行の削除と行の並び変えるプログラミング

    C言語で書き込んだファイルの重複行の削除と行の並び変えるプログラミング ファイル名が 0.txt というC言語で書き込んだテキストファイルがあり その中身は以下のようなものとします。 111 000 222 555 000 444 222 000 これらを行ごとに見て重複行を削除し 更に値の小さな順に並び変えたい、つまりファイル内を 000 111 222 444 555 となるようなプログラミングを考えているのですが 調べても分からず悩んでいます。 c言語のプログラム内に UNIXコマンドを扱う方法を考えているのですが c言語内でUNIXコマンドを併用するためのsystem()関数 や 重複行を削除する uniq というUNIXコマンドを どのようにプログラム内に挿入すればいいのでしょうか? ご回答、よろしくお願いいたします。 ちなみに以下のプログラムは system関数が理解できない私の作成失敗したものです。 #include <stdio.h> #include <stdlib.h> int main(void) { system("uniq 0.txt"); }

  • EXCELで行の先頭データが同じ行の削除方法について

    EXCELで次のようなことをしたいのですがどうしたら簡単にできるでしょうか?  AAA   AAA  AAA  AAA  AAA  BBB  BBB  BBB  CCC  DDD  DDD  DDD  DDD 上ようのなデータで重複している部分を削除し、  AAA  BBB  CCC  DDD としたいのですが。 今は一行々々で確認しながら削除してます。3000行程あり困ってます。 どうしたら簡単にできるでしょうか?  

  • 行単位で並び替えて、重複行を削除したい

    WindowsXPです。 テキストファイル、A.TXTがあり、10000行くらいなのですが、 行単位で並べ替えて、重複している同じものがあれば、これを1行にまとめたいのです。 並べ替えだけならば、MSDOSで、 sort A.TXT > outfile.TXT でいけそうですが、重複行をまとめることは出来そうにありません。 バッチファイルで処理をしたいのでMSDOSで捜しているのですが方法はないのでしょうか。 MSDOSに限らないとすれば、何か簡単にできる方法はありますか。 何かスクリプトみたいな感じで出来るといろいろと応用が出来ていいのですが。 関連して、WindowsXPでも、PERLが使えると聞きました。 WEBで捜しましたが、どうもどれがいいのか、また、インストール方法もよくわかりません。 フリーで使える、Windows上のPERL、あるいは、MSDOS以上に使い勝手のよいスクリプトがあれば、教えてください。

  • テキスト検索にヒットした行の次を出力したい

    あるコマンドを実行するとホスト名とそのステータスが2行にわたって得られるものがあります。 例えば以下のような結果になります。  Host = aaa  Status = 2  Host = bbb  Status = 1  Host = 123  Status = 5    : ここで、Host = bbbに該当する「Status = 1」の情報だけ抜き取る方法を考えています。 プログラミング能力のない自分では、  実行結果をファイルに書き出してperlでHost = bbbの該当行まで読み飛ばして次の行をprintで出力する という方法しか考えつきません。 awk,sed,perl,rubyなんかでワンライナーで実行できたらいいなぁと思っているのですが、 環境はLinuxまたはcygwinです。 何かいいアドバイスをお願い致します。

  • Excel2010で行ごとの重複削除

    Excel2010です。 A行目 1 3 5 5 2 2 3 B行目 2 3 5 5 4 4 C行目 1 9 7 9 9 ↓ A行目 1 3 5 2 B行目 2 3 4 5 C行目 1 7 9 というように、行ごとに重複の削除をしたいと思っています。 データタブに重複の削除があるのですが、列ごとにやるようなので、一度シート全体を 行と列を入れ替えて別シートにコピーして、 1列目全体を選択して、1列目で重複の削除を実行 2列目全体を選択して、2列目で重複の削除を実行 ・・・ というやり方もあるのですが、今扱っているエクセルは197行197列あります。 列選択、重複の削除アイコンをクリックするのを197回繰り返すのは大変です。 自動化する方法はないものでしょうか?

専門家に質問してみよう