• ベストアンサー

ワンライナーで実現したいです。

諸先輩方 よろしくお願いいたします。 仮りに下記のような場合、どのような方法で実現できますか? a.txt aaa bbb ccc b.txt aaadddfff hhhbbbjjj nnnmmmccc 上記2つのファイルがあるとき、a.txt の文字列を利用して、b.txtの 同じ文字列が含まれる行を一行づつ抜き出して表示させる。 出力イメージ aaa => aaadddfff bbb => hhhbbbjjj ccc => nnnmmmccc ※ 文字列や行数は可変、汎用性をもたせる。 google先生をフル活用しましたが、解決できませんでした。 以上になります。

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

  • ベストアンサー
  • smoky10
  • ベストアンサー率83% (5/6)
回答No.1

見た目にわかればいいだけなら、 awk 'NF>0{cmd="grep --color \""$0"\" b.txt";system(cmd)}' a.txt とかいかが。

shitsumontime
質問者

お礼

まさに、理想的、それ以上のワンラインです! 秘めたナレッジにさせていただきます。 ありがとうございました!

その他の回答 (2)

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.3

Rubyで書いてみました。 ※sed/awkやPerlで実現したほうが、汎用性に優れると思います。 検索対象を切り替えやすくする際の一例に <確認環境> Ruby.1.8.7 <使い方> ・引数1に条件文字列のリストファイルパス ・引数2以降で検索対象のリストファイルパスを列記 or 標準入力 <確認時ファイル構成> # a.txt aaa bbb ccc # b.txt aaadddfff hhhbbbjjj nnnmmmccc # c.txt foo1 foo2 fooaaa3 foo4 barccc4 <表示のみ&ファイルパス> ruby -n -e 'BEGIN{A=File.read(ARGV.shift).map(&:chomp)};(a=A.find{|l|$_.include? l})&&puts($_)' a.txt b.txt c.txt ↓ aaadddfff hhhbbbjjj nnnmmmccc fooaaa3 barccc4 <見出しつき&ファイルパス> ruby -n -e 'BEGIN{A=File.read(ARGV.shift).map(&:chomp)};(a=A.find{|l|$_.include? l})&&puts("#{a} => #{$_}")' a.txt b.txt c.txt ↓ aaa => aaadddfff bbb => hhhbbbjjj ccc => nnnmmmccc aaa => fooaaa3 ccc => barccc4 <見出しつき&標準入力> ruby -n -e 'BEGIN{A=File.read(ARGV.shift).map(&:chomp)};(a=A.find{|l|$_.include? l})&&puts("#{a} => #{$_}")' a.txt < c.txt ↓ aaa => fooaaa3 ccc => barccc4

shitsumontime
質問者

お礼

Ruby は書いたことが無かったため、ベストにはできませんでしたが、開発業務に移行した際は活用させていただきます。 これから、いただいたコード解析して学んでみます。 ありがとうございました!

  • smoky10
  • ベストアンサー率83% (5/6)
回答No.2

ついでに。先頭に見出しをつけたいのであれば sed 's/\(^.\+$\)/echo \"\0\=\>\"\;grep \-\-color \0 b.txt/g' a.txt | awk '{system($0)}' とかですかね。

関連するQ&A