• ベストアンサー

linuxコマンド・C言語での行抜き出し

2つのファイルを比較して一致しない行だけを 抜き出すという処理について教えてもらえますでしょうか? 例) 比較するファイルは以下のようなファイルとする。 ファイル1    ファイル2 A         A B         C C D 出力ファイル B D このような処理を行いたいのです。 方法としてはC言語かlinuxコマンドを用いたいのですが、 教えてもらえますでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • ky072
  • ベストアンサー率60% (85/140)
回答No.3

diff のオプションをいじればできると思います。 % diff --old-line-format='%L' --new-line-format='%L' --unchanged-line-format='' ファイル1 ファイル2

その他の回答 (2)

回答No.2

状況によってはcommコマンドが使えます。 (入力ファイルが辞書順にソートされた状態であることが(またはあらかじめソートしておくことが)必要です。) >cat 1 A B C D >cat 2 A C >comm -13 1 2 (ファイル2だけに出現する行→無い) >comm -23 1 2 (ファイル1だけに出現する行) B D >comm -12 1 2 (両方のファイルに出現する行) A C

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

diff?

noman1777
質問者

補足

ちなみにAというデータは 日付と数字になります 例) 2000/01/01 2.5

関連するQ&A

  • テキスト比較コマンドのdiffについて

    unixコマンドにdiffというのがありますね。2つのテキストファイルを比較してその違いを出力するというものです。このコマンドの意味がわからないところがあります。 テキストAとBの比較とは、 1 両者が全く同じかどうかを比較するということなのか、 2 テキストAとBに含まれている各行を取り出してどこかに一致する行があるかどうかをチェックするということなのか 3 あるいはそれ以外の意味 どのようなことを意味するのでしょうか。 1だったら、1行付け加わっただけでそれ以降が同じものであったとしても全部検索対象となり出力されます。 2だったら、何をしたことになるのでしょうか。全く同じ内容で行構成を入れ替えたら検索に引っかからないことになります。 私の希望としては1なのですが、そうするとわけがわかなないぐらい多くの出力結果となることが多いはずです。オプションなどで対応するとは思いますが、基本的には何をするコマンドなのでしょうか。 よろしくお願いします。

  • c言語  2つのファイルを行ごとに読み込むプログラミング

    c言語  2つのファイルを行ごとに読み込むプログラミング 0.txt と 1.txt という2つのテキストフォルダがあり 0.txt の中身は a a b b 1.txt の中身は c c d d というものとします。 これら2つのフォルダを読み込むとき まず1つのフォルダの1行目(a a)を表示し 他方の1行目(c c) 2行目(d d)を表示させて 続いて1つのフォルダの2行目(b b)を表示し 他方の1行目(c c) 2行目(d d)を表示させたいのです。 つまり実行結果が a a c c a a d d b b  ←理想の実行結果です c c b b d d となるようにしたいのですが #include <stdio.h> #include <stdlib.h> #define STR_MAX 256 int main(void) { FILE *fp, *fp2; int i, j, k; char buf[STR_MAX]; char buf2[STR_MAX]; fp = fopen("0.txt", "r"); fp2 = fopen("1.txt", "r"); if (fp == NULL && fp2 == NULL){ printf("\n"); } while(fgets(buf, STR_MAX, fp) != NULL){ while(fgets(buf2, STR_MAX, fp2) != NULL){ printf("%s%s", buf,buf2); } printf("\n"); } fclose(fp); fclose(fp2); return 0; } このプログラミングの実行結果は a a c c a a d d となり、0.txtの2行目(b b)は表示されません。 おそらく while 文 を2重にすることで 不具合が起きているのだと思うのですが 色々と調べた結果、これ以外に プログラミングが思いつきません。 私の理想の実行結果にするためには どこを訂正させると良いのでしょうか? 恐れ入りますが ご回答 どうかよろしくお願いいたします。

  • 【C言語】コマンドライン引数の標準入出力

    【C言語】コマンドライン引数の標準入出力 コマンドライン引数で、ファイル名を3つ渡します。-aの次のコマンドライン引数が、出力ファイル名です。 <<例>> ・実行モジュール -a 出力ファイル名 -b ファイル名 -c ファイル名 ・実行モジュール -c ファイル名 -a 出力ファイル名 -b ファイル名 もし出力ファイルが指定されなかった場合に、標準入出力を使いたいのですが、どうしたらいいかわかりません。 下記がソースの一部です。これをどう改造したらよいでしょうか。 分かる方いらっしゃいましたらご回答いただけると幸いです。 宜しくお願いします。 //出力ファイルを取得、書き込みモードでオープン for(j=1;j<argc-1;j++){ if(strcmp(argv[j],"-o")==0){ if((fo = fopen(argv[j+1],"w"))==NULL){ printf("open error!!\n"); exit(1); } } } while(fgets(buf,sizeof(buf),fp)!= NULL){ if(strstr(buf,"keyword")!= NULL){ //出力ファイルに出力 fprintf(fo,"%d:%s",line,buf); } }

  • 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"); }

  • SQL コマンド

    データの変換するコマンドを教えてください A|B ==== 1|A 2|B 3|C 4|A 5|D 6|A 7|D というテーブル内容を以下のように出力したいです。 だれがよいコマンドを教えてくださいませんか。 A B C D 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1

  • C言語で画像を出力したい

    C言語で画像を出力したい C言語で画像を出力したい ホントに初歩的な質問になるのですが、申し訳ありません。 私はC言語を使ってフーリエ変換(つまりsin波形とかスペクトルの出力)をしてみたいと思っています。 調べてみると「PGPLOT」というものが使いやすいと知ったので、インストールしたのですが、そこから先の設定の説明をみてもよくわかりません http://hooktail.org/computer/index.php?PGPLOT%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%A4%C8%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB%CA%FD%CB%A1 このサイトに載っている青枠で囲まれた部分(#とかから始まる文章)は一体どこに記入してるのですか? コマンドプロンプトに入力するのかなと思って実行したら 「'$' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 とか、出てきます。どこの箇所の設定の説明なんですか?もしよろしければ可能な範囲でいいので教えてください。 自分は数値計算でしかC言語を使用してないので全然わかりません。でもこの説明も分かる人にはわかるんですよね?どういった参考書や勉強をしたらわかるようになるんですか? それだけでもいいので教えてください。

  • linuxのgrepコマンドに関して

    linuxのgrepコマンドに関して ファイルの中から、1や2という文字が単独で存在する行を検索したくて grep 1 file名 とするのですが、そうすると11や23など文字が単独ではなく、含まれている行が出力されます。 含まれる、ではなく文字そのものを検索するにはどうしたらよいでしょうか?

  • 2行読み込んで一行戻り、また2行読み込む

    2行読み込んで一行戻り、また2行読み込む はじめまして、現在、「2行読み込み、一行戻り、また2行読み込む」処理のものを作成しています。 具体的には、 A B C D E と5行に渡り記述されたファイルを上記の旨で表示させる場合、 A B B C C D D E としたいのですが、 filename = ARGV[0] ABCDE = [] file = open(filename) while f = file.gets do  f.chomp!   g = file.gets   g.chomp!  p f  p g end file.close とすると出力は "A" "B" "C" "D" abcde.rb:9: private method `chomp!' called for nil:NilClass (NoMethodError) もちろん2行読み込んで、そのまま次の2行を読み込む記述のため上記のようになってしまいます。 まとめますと、 「一行戻るための記述がわからないので、それを実現するための記述を教えてほしい」 ということです。 rewindを使うと先頭まで戻ってしまうのでどうしたらいいのかさっぱりです。 わかりづらくて非常に申し訳ない、初歩的であろう質問ですがよろしくお願いします。 rubyは1.8.6を使っています。

    • ベストアンサー
    • Ruby
  • robocopyコマンド

    以下のコマンドを実行し、logを見ると、エラーのようなものが出ているのですが、 このような場合は、再度、robocopyコマンドを実行すべきでしょうか? >robocopy c:\Windows \FVserver1\bk /MIR /R:0 /W:0 /NP /TEE /LOG:log.txt 新しいファイル 16640 7B296FB0-376B-497e-B012-9C450E1B7327-5P-1.C7483456-A289-439d-8115-601632D005A0 2014/12/01 20:12:54 エラー 32 (0x00000020) ファイルをコピーしています c:\Windows\System32\7B296FB0-376B-497e-B012-9C450E1B7327-5P-1.C7483456-A289-439d-8115-601632D005A0 プロセスはファイルにアクセスできません。別のプロセスが使用中です。 -----------------------------------処理結果------------------------------------------- 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 14422 14412 10 0 0 0 ファイル: 62685 62632 11 0 42 0 バイト: 10.193 g 10.055 g 34.06 m 0 107.62 m 0 時刻: 0:43:04 0:19:53 0:00:00 0:23:10 スキップ(ディレクトリ:12、ファイル:11)や不一致(ファイル:42)のものは、どうすべきなのでしょう? 完全にコピーできていないということでしょうか? 何か、robocopyってやたらと時間がかかって、単純にコピペの方が 楽な気もするのですが、何が良いのでしょう??

  • 【Linux】各項目のカウント【コマンド】

    はじめまして。シアトルでシスアド見習いをしているものです。 今日はみなさんに、Linux関連のコマンドをお聞きしたくて質問させていただきます。 Linuxを使っていると、例えばメール通数をカウントする際「wc -l」などをよく使います。 全体のラインをカウントする時にはそれでいいのですが、各ユニークな項目ごとのカウントをそれぞれ出すようなコマンドなどがないかと探しております。 感覚的には A A B B B C C C C D というラインがあったら、 A 2 B 3 C 4 のような表示になれば嬉しいなと思います。 シェルスクリプトを書いてForで回して・・・などもできるのですが、もしそういう専用コマンドなどありましたらご教授いただけると幸いです。 よろしくお願いします。