2つのファイルにそれぞれ文字列が入っているのですが、

これを比較して同じ文字列があった場合にその文字列を抜き出すスクリプトを教えて下さい。

ファイル1
1
1
2
3
5
8
8
8
10

ファイル2
3
3
8

の場合に、出力結果が3と8が出力されるようなスクリプト(コマンド)を探しています。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/07/23 11:45:00
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:hujikojp No.1

回答回数101ベストアンサー獲得回数7

ポイント30pt

http://en.wikipedia.org/wiki/Comm

% comm -1 -2 aaa bbb
3
8
id:gatcch

commコマンドは知りませんでした。

参考になります。

2008/07/23 11:37:38

その他の回答4件)

id:hujikojp No.1

回答回数101ベストアンサー獲得回数7ここでベストアンサー

ポイント30pt

http://en.wikipedia.org/wiki/Comm

% comm -1 -2 aaa bbb
3
8
id:gatcch

commコマンドは知りませんでした。

参考になります。

2008/07/23 11:37:38
id:rubikitch No.2

回答回数120ベストアンサー獲得回数22

ポイント10pt

Rubyで。一方の行をハッシュのキーに格納し、他方の行がハッシュに含まれてるか調べる。

def compare(io1, io2)
  h = {}
  io1.readlines.each {|l| h[l] = true }
  result = []
  io2.readlines.each {|l| result << l if h.has_key? l }
  result.uniq
end

open(ARGV[0]) do |io1|
  open(ARGV[1]) do |io2|
    puts compare(io1, io2)
  end
end
id:gatcch

色々な場合に応用できそうですね。

ありがとうございます。

2008/07/23 11:39:49
id:syntaxerror No.3

回答回数354ベストアンサー獲得回数56

ポイント20pt

( ( sort ファイル1 | uniq ) ; ( sort ファイル2 | uniq ) ) | sort | uniq -d

unix の sort と uniq を使えばできます。

実行結果

> cat file1

1

1

2

3

5

8

8

8

10

> cat file2

3

3

8

> ( ( sort file1 | uniq ) ; ( sort file2 | uniq ) ) | sort | uniq -d

3

8

>

id:gatcch

なるほど、各ファイルからダブった部分を消してから

再度sortして重複した部分をuniqで消すと言うことですね。

ありがとうございました。

2008/07/23 11:41:33
id:backupper No.4

回答回数95ベストアンサー獲得回数10

ポイント25pt

以下でどうでしょう。

cat <(sort ファイル1 | uniq) <(sort ファイル2 | uniq) | grep -v '^$' | sort | uniq -d
id:gatcch

3番の方と同じ考え方ですが、grepを使うところが面白いですね。

ありがとうございました。

2008/07/23 11:42:30
id:Mook No.5

回答回数1314ベストアンサー獲得回数393

ポイント30pt

OS 等の情報を記載ください。


これまでの質問から UNIX・LINUX 環境での話かと思うのですが、

下記のコマンドでどうでしょうか。

cat ファイル1 | grep -f ファイル2 | sort -u

id:gatcch

OSはLINUX環境になります。

grepの使い方がエレガントですね。

参考になりました。

2008/07/23 11:43:30

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません