【发布时间】:2012-12-12 06:41:14
【问题描述】:
输入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 中删除第二列。有没有人对此有更好的解决方案。
【问题讨论】:
输入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
【讨论】: