1つだけ過去を変えられるとしたら?

諸先輩方
よろしくお願いいたします。

仮りに下記のような場合、どのような方法で実現できますか?

a.txt
aaa
bbb
ccc

b.txt
aaadddfff
hhhbbbjjj
nnnmmmccc

上記2つのファイルがあるとき、a.txt の文字列を利用して、b.txtの 同じ文字列が含まれる行を一行づつ抜き出して表示させる。

出力イメージ
aaa => aaadddfff
bbb => hhhbbbjjj
ccc => nnnmmmccc

※ 文字列や行数は可変、汎用性をもたせる。

google先生をフル活用しましたが、解決できませんでした。

以上になります。

A 回答 (3件)

見た目にわかればいいだけなら、


awk 'NF>0{cmd="grep --color \""$0"\" b.txt";system(cmd)}' a.txt
とかいかが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/07 17:28

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/07 17:34

ついでに。

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報