2012-04-28 7 views
4

最初のカラムの値でソートされたカラムを持つファイルが2つあり、最初のカラムの値が2番目のカラムの値の場合のみマージしたい。最初のファイル/ bashスクリプトにキーがある場合は2つのファイルをマージする

最初のファイルは、この

man01 xxx yyy zzz 
man02 xxx yyy zzz 
man03 xxx yyy zzz 
man04 xxx yyy zzz 

第ファイル

man01 sss 
man08 sss 

ようなもので、所望の出力は、私が参加しようとしたが、第2のファイルの値に存在する必要

man01 xxx yyy zzz sss 
man02 xxx yyy zzz 
man03 xxx yyy zzz 
man04 xxx yyy zzz 

あります最初のもの:/

+0

レコード間に空白行がありますか? – kev

+0

Perlのために良い仕事のように見えますか? (誰かが基本的なツールを使ってこれを解決する合理的な方法を考えることができるなら、私は感銘を受けたでしょう!) – thb

+0

'comm'と 'paste 'は手間がかかり、' man'ページを読むことができます – c00kiemon5ter

答えて

14

参加できます。-aオプションを検討しましたか?これは、a.txtとb.txtのそれぞれの不適当なファイル行の行を生成します。

join -a1 a.txt b.txt 

man01 xxx yyy zzz sss 
man02 xxx yyy zzz 
man03 xxx yyy zzz 
man04 xxx yyy zzz 
+0

完璧なソリューション。 – kev

+0

うわー!イェップ!それはそれでした! :Dおまえ! –

0

これは、エレガントなコマンドラインの使い方の美しさではありませんが、これはどうですか?

perl -we 'open F1, "<file1.txt"; open F2, "<file2.txt"; my %f2 = map {/(\S+)/ ? ($1=>$_) :()} <F2>; while (<F1>) { chomp; print; if (/(\S+)/ && exists $f2{$1}) { $f2{$1} =~ /\S+\s+(.*)/ and print " $1"; } print "\n"; }' 

アップデート:私は上記に取り組んでいたがが、それははるかにエレガントな答えを思い付いた@buntingとする@ c00kiemon5terかのように思えます。優れた!

関連する問題