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

4

4 回答 4

5

这是一种使用方法awk

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

结果:

a    1
d    100
f    90
于 2012-12-12T06:49:13.500 回答
1

这可能对您有用(GNU sed):

sed -r 's|(\S+).*|/\\<\1$/p|' input1 | sed -nf - input2
于 2012-12-12T11:15:05.830 回答
0

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

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

输出:

a    1
d    100
f    90

请注意,grep 不是列感知的,并且会很乐意匹配它可以匹配的位置。

于 2012-12-12T07:59:27.887 回答
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
于 2012-12-12T09:27:23.263 回答