使用文件从另一个文件中提取特定行

时间:2012-12-12 06:41:15

标签: linux shell sed awk

INPUT1:

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中删除第二列。有没有人有更好的解决方案。

4 个答案:

答案 0 :(得分:5)

这是使用awk的一种方式:

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

结果:

a    1
d    100
f    90

答案 1 :(得分:1)

这可能适合你(GNU sed):

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

答案 2 :(得分:0)

根据您的要求,grep可能会这样做:

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

输出:

a    1
d    100
f    90

请注意,grep不支持列,并且可以尽可能地匹配。

答案 3 :(得分: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