2012-12-12 40 views
2

輸入1:使用文件從另一個文件中提取指定的行

1 s1 
100 s100 
90 s90 

輸入2:

a 1 
b 3 
c 7 
d 100 
e 101 
f 90 

輸出:

a 1 
d 100 
f 90 

我知道join能做到這一點,但它需要(1)加入後排序這些常用字段(2),我需要從input1中刪除第二列。有沒有人有更好的解決方案。

回答

5

下面是使用awk一個辦法:

awk 'FNR==NR { a[$1]; next } $2 in a' file1 file2 

結果:

a 1 
d 100 
f 90 
0

根據您的要求,grep的可能會做:

grep -wFf <(cut -d' ' -f1 input1) input2 

輸出:

a 1 
d 100 
f 90 

請注意,grep不支持列,並且會很樂意地匹配它的位置。

0

據我所知,awk對此更好,但由於它已經提供:下面是perl解決方案。

> perl -F -lane '$H{$F[0]}=$F[1];END{%T=reverse(%H);foreach (values %H){if(exists($H{$_})){print $T{$_}." ".$_;}}}' file1 file2 
a 1 
d 100 
f 90 
1

這可能爲你工作(GNU SED):

sed -r 's|(\S+).*|/\\<\1$/p|' input1 | sed -nf - input2 
相關問題