2013-02-12 83 views
1

說我有這種格式 文件1文件:如何篩選基於另一個文件

kk a 1 
rf c 3 
df g 7 
er e 4 
es b 3 

和其他文件2:

c 
g 
e 

我想過濾的第二列基於文件2並輸出一個這樣的文件:

rf c 3 
df g 7 
er e 4 

怎麼會這樣的linux命令?

+0

好編輯,奧拉夫=)現在更有意義! – paddy 2013-02-12 22:22:05

回答

0

如果兩個文件都排序或按正確的順序排列,則可以使用join。雖然這給出了一個不同的輸出

join --nocheck-order -1 2 -2 1 file1.txt file2.txt 

c rf 3 
g df 7 
e er 4 

用Perl,您可以讀取鍵文件,然後檢查每一行是否匹配

use strict; 
use warnings; 

my %keys; 
open(my $f1, '<', 'file2.txt') or die("Cannot open file2.txt: $!"); 
while (<$f1>) { 
    chomp; 
    $keys{$_} = 1; 
} 

close($f1); 

open(my $f2, '<', 'file1.txt') or die("Cannot open file1.txt: $!"); 
while (<$f2>) { 
    my(undef, $col2, undef) = split(' ', $_); 
    print if ($keys{$col2}); 
} 

close($f2); 

這將給期望

rf c 3 
df g 7 
er e 4 
0

不一定很快或很漂亮,但做的伎倆:

cut -f 2 -d ' ' file1 | while read letter; do grep -n "$letter" file2 | cut -d ':' -f 1 | while read lineNo; do sed $((lineNo+1))'!d' file1; done; done; 
1
awk 'NR==FNR{A[$1];next}($2 in A)' file2 file1