2012-04-28 37 views
4

我有兩個文件,其中的列按第一列的值排序,我想只在第二個文件的值存在於第一列。如果存在於第一個文件/ bash腳本中,則按鍵合併兩個文件

第一文件是這樣的

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

第二個文件

man01 sss 
man08 sss 

和期望的輸出是

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

我試圖加入,但需要第二文件的值中存在第一個:/

+0

記錄之間是否有空行? – kev 2012-04-28 14:39:23

+0

Perl看起來很不錯,不是嗎? (如果有人可以想出一個合理的方法來解決這個問題,使用基本的工具,我會留下深刻的印象!) – thb 2012-04-28 14:40:02

+0

我沒有太多時間,但'通訊'和'粘貼'可以證明得心應手,閱讀他們的'人'頁 – c00kiemon5ter 2012-04-28 14:41:02

回答

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 2012-04-28 14:46:29

+0

哇!葉氏!做到了! :D thanx !! – 2012-04-28 15:10:05

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用更優雅的回答上來。優秀!

相關問題