输入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 中删除第二列。有没有人对此有更好的解决方案。
这是一种使用方法awk
:
awk 'FNR==NR { a[$1]; next } $2 in a' file1 file2
结果:
a 1
d 100
f 90
这可能对您有用(GNU sed):
sed -r 's|(\S+).*|/\\<\1$/p|' input1 | sed -nf - input2
根据您的要求, grep 可能会:
grep -wFf <(cut -d' ' -f1 input1) input2
输出:
a 1
d 100
f 90
请注意,grep 不是列感知的,并且会很乐意匹配它可以匹配的位置。
据我所知,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