• 締切済み

重複レコードのチェックができなくて困っています。

UNIX / Cシェル ファイルが以下の条件のときにエラーとなるようにしたいのですが、どのような処理にすればよいかわかりません。 ファイルは各項目固定長(1つ目5バイト、2つ目6バイト、3つ目7バイト) AAAAABBBBBBDDDDDDD・・・(1) AAAAABBBBBBCCCCCCC・・・(2) EEEEEFFFFFFGGGGGGG・・・(3) EEEEEHHHHHHJJJJJJJ・・・(4) KKKKKLLLLLLMMMMMMM・・・(5) (1)と(2)のように頭2つの項目((1)でいえばAAAAAとBBBBBB)が一致している場合はエラーではないが、(3)と(4)のように頭1つの項目は一致しているが、2つ目の項目が違うものはエラーとなるように処理。 (5)のように1つ目の項目が一致するものがなければエラーではない。 初めての質問のため至らない点もあるかと思いますが、よろしくお願いします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

最近のUnixでPerlが入ってない(最新版かどうかはともかく)ってのは 商用でもあまり考えられないような気がするんですがそれはさておき。 awkだとこんな感じですか。 なおちょっと考えれば分かることですが、処理対象のファイルが でかくなるにつれて加速度的に処理時間が延びていきます。 #!/usr/bin/awk -f { idx = FNR split("", f); f[1] = substr($0, 1, 5); f[2] = substr($0, 6, 6); f[3] = substr($0, 13, 7); f1[idx] = f[1]; f12[idx] = f[1] f[2]; for (i=1; i<idx; i++) { if (f[1] == f1[i] && (f[1] f[2]) != f12[i]) printf "dupulicate record is at %d: %s\n", FNR, $0 > "/dev/stderr"; } }

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

元ファイルの大きさによってはいろいろ改良の余地があると思いますが とりあえずの例で #!/usr/bin/perl use strict; use warnings; use feature ':5.10'; my $template = 'A5 A6 A7'; my @records; while (my $line = <DATA>) { chomp $line; my @fields = unpack $template, $line; foreach my $item_ref (@records) { say "duplicate record is at $. '$line'" if ($fields[0] eq $item_ref->[0] && $fields[1] ne $item_ref->[1]); } push @records, [@fields]; } __END__ AAAAABBBBBBDDDDDDD AAAAABBBBBBCCCCCCC EEEEEFFFFFFGGGGGGG EEEEEHHHHHHJJJJJJJ KKKKKLLLLLLMMMMMMM 実行結果: duplicate record is at 4 'EEEEEHHHHHHJJJJJJJ'

ddeschamps
質問者

補足

sakusaker7さん 回答ありがとうございます。 説明が足らず申し訳ございません。 Perl、Rubyは環境として使えないです。awkは使えますがgawkが使えたかはわかりません。 できれば、UNIXのコマンドなどを使ってできる方法を探しています。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

ああ、すみません。 全体で重複があるかどうかチェック、ですね。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

何と何を比較するのでしょうか? 一つのファイルの1行目と2行目、2行目と3行目…とか? それから >Cシェル Perl/Ruby/gawk を使うのはあり? なし?

関連するQ&A

  • 1レコードからなるファイルを複数レコードに分割

    可変長の1レコードのみのファイル(固定長のレコードが改行コードなくつながっている)をもとにして、固定長のcsvファイルを作成する方法をお教えください。 具体的には、 項目A(10バイト)、項目B(5バイト)、項目C(20バイト)からなる35バイトのデータが改行コードなくつながっている50000バイトくらいの1レコードを入力して、項目A,B,Cから1レコードが構成されるcsvファイルを作成したいと思います。 よろしくお願いします。

  • awkで計算した結果を反映させる方法

    初心者です。おしえてください。 awkで次のようなことをするにはどうすればよいでしょうか? コーディング例を教えてください。 テキストファイルのレコードの一部が数値項目で、 その数値項目から3を引いた結果をその数値項目に置換えたいです。 (区切り文字がない1レコードのみが入ったテキストファイルを読み込みます。) 例) aaaaa10000bbbbb20000 6~10カラムの「10000」から-3をした「9997」を置き換えて、 aaaaa09997bbbbb20000 としたいです。 awkで無くても、Unix(HP-UX)のコマンドやBシェルで可能であれば、 構わないのでおしえてください。 よろしくお願いいたします。

  • シェルスクリプトで・・・

    シェルスクリプトで・・・ 下記のファイル内にある "yy:mm:dd" 部分を "finish - start" として "aaaaaa" "bbbbbb" "cccccc" ・・・を秒単位で抽出させたいと考えています。 □ ファイル 2010-09-01 08:19:10 aaaaa : start. 2010-09-01 08:19:28 aaaaa : finish. 2010-09-01 08:19:28 bbbbb : start. 2010-09-01 08:30:07 bbbbb : finish. 2010-09-01 08:30:11 ccccc : start. 2010-09-01 08:43:45 ccccc : finish. ・・・・・・・・・・・・・・・・・(ry □ 結果のイメージはこうです。 aaaaaa 17 bbbbb 639 ccccc 814 環境は、centos5 を使っております。 どなたかご教授おねがいします。

  • Solaris系FTPシェルについて

    Solaris6or7系でFTPシェルでファイルリストから連続してダウンロードしたいと思っていますが、 シェル初心者で、ファイルからの読み込み、ループ処理など何を考慮しシェル化すれば困っています。ご教授お願い致します。 #!/bin/sh cd /ファイル保存ディレクトリ ftp -n << EOF !echo start open ダウンロードサーバ user ユーザー パスワード mput ファイルリスト     aaaaa bbbbb ccccc       :       :     数千ファイル  !echo end bye EOF 条件として ・ファイル保存先にはリストのすべてのファイルが存在する ・リスト内のファイルは重複なし ・拡張子はすべて同じもの(実際はUNIX識別番号などです) ・ファイル及び転送先ディスクの容量は考慮しない 以上よろしくお願いします

  • 4Gバイトのファイルを開くには?

    C初心者です。 稼動環境はUNIX(AIX)です。 4Gバイトのテキスト・ファイルを処理しなければならないのですが、fopen()を使用すると、エラーが出て開くことができません。 動的にメモリを割り当てればよいのかな?と思いますが具体的な方法がわかりません。 どなたか教えていただけますか?

  • Cシェルプログラムで、あるディレクトリ上にあるファイルサイズが0バイトのものを削除する

    Cシェルプログラムで、あるディレクトリ上にあるファイルサイズが0バイトのものを削除する処理を作りたいのです。どのようなコマンドを使って組んだらよいのでしょうか?

  • 固定長レコードの取り扱い

    ファイルから固定長のレコードを読み込んで、そのレコードから、ある項目をとりだしたいのですが・・・ レコードのフォーマット   名前 : Ch (8byte)   金額1: Int(4byte)   金額2: Int(4byte)   金額3: Int(4byte) ここから、金額2を取り出すには、どうしたら?・・・ $kingaku2 = substr($rec, 12, 4); と、やると、うまくいかない($kingaku2 の Length が 0 になってしまうような・・・)のですが・・・

    • ベストアンサー
    • Perl
  • シェルスクリプトでのファイルの存在チェック

    シェルスクリプトで、あるディレクトリの下に、*.cファイルか*.hファイルのどちらかがあるかどうかを調べるにはどうしたら良いでしょうか? ファイルが存在しない場合のエラーメッセージは表示させたくありません。 test grep *.c *.h if [ $? -eq 1 ] でやってみたのですが、*.cファイルか*.hファイルの両方が存在すればエラーメッセージは表示されませんが、どちらかがない場合はエラーメッセージが表示されてしまいます。

  • マイクロソフトのバッチ処理について

    マイクロソフトのバッチ処理は、MSDOSのころから連綿として続いている機能で、unixのシェルを適用させたものと思います。 記述されているコマンドを上から順番に進めていくということになると思っていますが、ループ化することはできるのでしょうか。 100個のファイルがあって1つ1つナンバリングされていますが、それを一挙に処理するために同じ処理を100行にわたって書くことを行っています。ただし、ファイル名が違うのでそこは変えていますが。 同じことを100回書くのが苦痛なのでperlのようなもので書き出す工夫はしています。バッチがループで回ってループカウンタとファイル名をうまく合わせると2,3行で済むのではないかと思うのですが。こういうことはできないものなのでしょうか。unix, Linuxにいったん渡してそこでシェルスクリプトで処理することは今回はできません。Windows上限定のことなのですが。よろしくお願いします。

  • Excelで条件に一致したものだけQUARTILE

    条件に一致したものだけQUARTILE関数を使用して集計を行いたいのですが、 思うような結果にならず困っています。 Aシートに一覧があり、集計はBシートにて行おうとしています。 一覧にはC、D項目があり、C項目と固定の条件値が一致する全てのD項目を QUARTILE関数(引き数は2の中位数)で集計を行い、Bシートに表示させようとしています。 例として・・・ Aシート 期間(C項目)|金額(D項目) ーーーーーーーーーーーーーー 1       |200 3       |100 1       |800 2       |300 2       |700 1       |150 Bシート 期間(固定条件)|QUARTILE関数で集計 ーーーーーーーーーーーーーー 1         |200 2         |500 3         |100 何かよい方法があれば、ご教示ください。よろしくお願いします。

専門家に質問してみよう