• ベストアンサー

ファイルの結合

nightowlの回答

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

こんにちは。もうご自分で解決されましたでしょうか? GNU sort 2.0.8(GNU textutils)では最初からお望みの結果が出たのですが、 処理系依存の動作のようですので、No.1 の方のアドバイスに沿って AWK の一行野郎(ワンライナー)をどうぞ。 $ awk -F, '{if (a[$2] != $2) {a[$2] = $2; print $0}}' fileA fileB 行ごとに第2フィールドを連想配列(ハッシュ)に突っ込んでいきます。 そして、現在行の第2フィールドが連想配列に登録されていない、 つまりこの値が初めて現れた行のみを出力するという考え方です。 この結果をソートする必要があれば、改めてパイプで sort に出力を食わせてください。 以下、余談です。AWK の子孫である Perl や Ruby には AWK エミュレーションモードなるものがありますので、試してみましょうか。 perl -F, -ane ' if ($a{$F[2]} ne $F[2]) {$a{$F[2]} = $F[2]; print}' fileA fileB 「-F,」は sort での「-t,」と同じです。「-an」で AWK の動作を模倣するとお考え下さい。 ちなみに「-pn」だと sed と同じような挙動になります。 分割されたフィールドは配列 @F に入り、$F[n](n は添え字)で呼び出せます。 ここではハッシュ(連想配列)は $a になります。 「$」で始まるのが Perl 変数の特徴。 また、Ruby ではこうなります(Perl とはどこが違うでしょうか?)。 Ruby は環境によってはインストールされていないかもしれません。 ruby -F, -ane 'BEGIN{$a={}}; if $a[$F[2]] != $F[2]; $a[$F[2]] = $F[2]; print end' fileA fileB うーん、Perl よりも若干長くなっていますね。 しかも BEGIN なんとかも増えてるし^^; これはハッシュオブジェクトを作り、 それをグローバル変数に入れて持ち歩く必要があるためで、 スクリプトの規模が大きくなれば可読性は逆転します。 こっちの方がまだいいかもしれません。 ruby -F, -an -e 'BEGIN{$a=Hash.new}' -e 'if $a[$F[2]] != $F[2] then $a[$F[2]] = $F[2]; print end' fileA fileB これ以上複雑になった場合はスクリプトをファイルにした方がいいですね。 (所詮エミュレーションはエミュレーションですので、 一行野郎だけで言語の美しさを判断しないでください) なお、Ruby には対話的な実行環境コマンド「irb」があります。 Python インタプリタ自体も対話環境ですし、 Perl でも裏技的ですがデバッガ起動すれば対話的に使えます。 (「perl -d /dev/null」で起動するとすぐデバッガのコマンドラインに落ちます。 継続行の行末には「\」をつけてください。この配慮は irb や python では不要です)

関連するQ&A

  • 文字変換で,を改行されないようにしたい

    下記のスクリプトでファイルから読み込んだ行毎の文字列<>を'=>'に変換後、行の先頭に'を付け足し行の最後に',を付け加えた場合、変な風に改行されてしまいます。 $ cat list1.txt 01<>ああああ 01_01<>あAAA 01_02<>あBBB 01_03<>あCCC 01_04<>あDDD 02<>いいいい 02_01<>いAAA 02_02<>いBBB 02_03<>いCCC 02_04<>いDDD open(IN, "<list1.txt"); @datas = <IN>; close(IN); open(OUT, ">date.txt"); foreach (@datas) { ($a, $b) = split(/<>/, $_); print OUT "'$a'=>'$b',"; } close(OUT); 実行結果 $ cat date.txt '01'=>'ああああ ','01_01'=>'あAAA ','01_02'=>'あBBB ','01_03'=>'あCCC ','01_04'=>'あDDD ','02'=>'いいいい ','02_01'=>'いAAA ','02_02'=>'いBBB ','02_03'=>'いCCC ','02_04'=>'いDDD ', これを下記のように整形するにはスクリプトのどこを直せばよいのでしょうか。 '01'=>'ああああ', '01_01'=>'あAAA', '01_02'=>'あBBB', '01_03'=>'あCCC', '01_04'=>'あDDD', '02'=>'いいいい', '02_01'=>'いAAA', '02_02'=>'いBBB', '02_03'=>'いCCC', '02_04'=>'いDDD', どなたかご教授お願い致します。(上記のスクリプト以外の方法で スマートなやり方などありましたらあわせてご教授頂けますと助かります。)

    • ベストアンサー
    • Perl
  • CSVに外部テキストファイルを列として追加する方法

    こんにちは。 CSVファイル(base.csv)の先頭列に、別のテキストファイル(add.txt)の中身を新規の列として挿入したいと考えているのですが、よい方法がわかりません。。。 どうのような方法を使えば対応することができるでしょうか? どうぞよろしくお願いいたします。 ■CSVファイル(master.csv) title,developer_name,seller_name,primary_genre_name,application_url AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE ■テキストファイル(add.txt) id 000 111 222 333 ↓ ■目標としたファイル(master.csv) id,title,developer_name,seller_name,primary_genre_name,application_url 000,AAA,BBB,CCC,DDD,EEE 111,AAA,BBB,CCC,DDD,EEE 222,AAA,BBB,CCC,DDD,EEE 333,AAA,BBB,CCC,DDD,EEE

  • [シェルの質問]改行と結合

    bsh初心者です。 よろしくお願いします。 1)下記のような","で区切られている場合、","を見つけたら  改行して出力したいです。 [入力] aaa,bbb,ccc, ddd,eee,fff [出力] aaa, bbb, ccc, ddd, eee, fff 2)下記のように、ある文字"aaa"をみつけたら、その次の行と結合して  出力したいです。 [入力] aaa: Hello! [出力] aaa:Hello! とこんな感じです。 awkとか使わないとできないでしょうか? awkはあんまり詳しくないので、できたら 記述例をいただけると幸いです よろしくお願いします。

  • 抽出して並べ替えたい

    初めまして 非常に悩んでいます。 エクセルシートの列に下記のようにデータが並んでいます。(文字列) AAA bbb ccc (空白) BBB ddd eee (空白) AAA bbb ccc (空白) AAA eee ggg 並べ替え後 AAA AAA BBB bbb eee ddd ccc ggg eee 尚、列上でセル位置は任意で、空白行も任意です。(1つ以上です) できれば関数でお願いします。 VBAの場合、使用したことがないので詳しくお願いします。

  • エクセルで列にあるユニークなデータの個数が知りたい

    おはようございます。 エクセルでA列に以下のようなデータがあるとします。 この中で何種類のデータがあるのかを知りたいのです。 この場合は、AAA,BBB,CCC,DDD,EEEの5種類なので5という答えが欲しいのです。 ただし、A列に入るデータは非常に多岐(800種類以上)に渡ります。 また、印刷を前提としてるためソートなどはできません。 さらに1枚のシートにこのようなデータがいくつかあるので、その決まった範囲内で個数を抽出する必要があります。 なにとぞ皆様のお知恵をお貸しくださいませ。 よろしくお願いします。 AAA AAA BBB CCC AAA DDD DDD BBB DDD DDD EEE EEE

  • EXCELで複数行の検索

    初心者です。 Aファイルのaaa、bbbなどをキーに Bファイルを検索してできるだけ簡単にマクロ等使わずに 下記のような抽出をする方法があれば教えてください。 よろしくお願いします。 Aファイル aaa bbb ccc Bファイル(例えば「ddd」と「あ」は別セルです) ddd あ eee い aaa う fff え bbb お ggg か ccc き 結果 Aファイル aaa う bbb お ccc き

  • sedで「(~)」を使って文字列の一部を取り出し

    sedで「(~)」を使って、文字列の一部を取り出したいのですが期待した結果になりません。 以下のようなファイルがあります。 そこから、最初に見つかった「A-Z0-9」を含む文字列を取り出したいのですが、 どうしても、2番目にでてくる「0-9」でなる文字列が取り出されます。 環境は、Solaris/Linuxになります。 ■ファイル cat aaa "aaa","bbb","ccc","123456","ddd","eee","fff,"0000","ggg" "aaa","bbb","ccc","AAA123","ddd","eee","fff,"0000","ggg" ■sed sed 's/.*,"\([A-Z0-9].*[0-9]\)",.*$/\1/g' aaa ■結果 0000 0000 期待する結果は、 123456 AAA123 なのですが、 期待した結果を取り出すにはどうしたらよいのでしょうか。

  • excel ピボットテーブルについて

    お世話になります。 Excelのピボットテーブルについてですが、例えば下記のような感じのデータを 集計したいときに、行ラベルに「名前」を持って行き、列ラベルには「日付」を持って いったとしたときに、行ラベルはAAA、BBB、CCC、DDDではなく、AAAとBBB以外は その他でまとめたいとき(AAA、BBB、その他)、どう設定すればいいか悩んでいます。 ご存知の方がいらっしゃれば教えてください。ちなみにExcel2010を使用しています。 日付 名前 個数 4/1  AAA 1 4/1  BBB 1 4/2  CCC 1 4/2  DDD 2 4/2  AAA  3 4/3  CCC 1

  • ある項目(数値)に加算したものでソートしたい。

    ある項目(数値)に加算したものでソートしたい。 下のようなテーブルがあります。 そのpointに加算した結果でソートしたいのですが、可能でしょうか? テーブル name  | point ああAAA| 100 ああBBB| 400 いいCCC| 300 ううDDD | 200 おおCCC| 500 ============== ふつうにORDER BY point DESC でソートすると下記のようになります。 おおCCC| 500 ああBBB| 400 いいCCC| 300 ううDDD | 200 ああAAA| 100 ============== そこでpointに加算した結果(dbには反映させず、あくまで表示上のみ) name[ *CCC]にはpointに80%加算 いいCCC 300→540 おおCCC 500→900 ソート結果 おおCCC| 900 いいCCC| 540 ああBBB| 400 ううDDD | 200 ああAAA| 100 ============== このような事は可能でしょうか?

  • エクセルで関数を組みたい。

    エクセルでA列に以下のようなデータがあるとします。 (1)この中で何種類のデータがあるのかを出し、   この場合は、AAA,BBB,CCC,DDD,EEEの5種類なので5と出し、 (2) その5種類の中で、1回だけのものが●件、2回のものが●件  (・・・大体15回くらいが多い回数になります。) という数字を出したいのです。 印刷を前提としてるためソートなどはできません。 (1)については、何とか解決いたしました。下記を使用します。 =COUNT(INDEX(1/(MATCH(A1:A1000,A1:A1000,)=ROW(A1:A1000)),)) (2)が全く分かりません。 皆様のお知恵をお貸しくださいませ。 宜しくお願い致します。 AAA AAA BBB CCC AAA DDD DDD BBB DDD DDD EEE EEE