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