2012-01-09 120 views
1

我有这种文件file-1的:记录过滤

1  1  1.1552422143268792 
1  2  1.1552422143268792 
1  3  1.1552422143268792 
1  4  1.1552422143268792 
2  1  2.1906014042706916 
2  2  2.1906014042706916 
2  3  2.1906014042706916 
2  4  2.1906014042706916 
2  1  4.1906014042706916 
2  2  4.1906014042706916 
2  3  4.1906014042706916 
2  4  4.1906014042706916 
3  1  3.1876823799523781 
3  2  3.1876823799523781 
3  3  3.1876823799523781 
3  4  3.1876823799523781 
4  1  0.6213184222668061 
4  2  0.6213184222668061 
4  3  0.6213184222668061 
4  4  0.6213184222668061 

,我有antoher文件太file-2

1 
2 
4 

我想从file-1过滤那些记录,其中的值第一列与file-2相同,所以我想得到这个输出

1  1  1.1552422143268792 
1  2  1.1552422143268792 
1  3  1.1552422143268792 
1  4  1.1552422143268792 
2  1  2.1906014042706916 
2  2  2.1906014042706916 
2  3  2.1906014042706916 
2  4  2.1906014042706916 
2  1  4.1906014042706916 
2  2  4.1906014042706916 
2  3  4.1906014042706916 
2  4  4.1906014042706916 
4  1  0.6213184222668061 
4  2  0.6213184222668061 
4  3  0.6213184222668061 
4  4  0.6213184222668061 

任何人都可以帮忙吗?

回答

4
awk 'NR==FNR{f2[$1];next}$1 in f2' file-2 file-1 
+0

看起来是一个班轮超过3派好得多。希望你跟我更新它。 :) – 2012-01-10 05:15:42

+0

嗨@JaypalSingh,是的,没问题!我更喜欢前面的代码缩进,但是我也没有那个问题:) – 2012-01-10 09:00:41

1

您可以使用grep中的-f选项从文件中读取模式。但首先你必须改变模式,以便它们只与第一个字段匹配。您可以通过使用sed^添加到文件-2中的每个模式的开始处和结尾以及在命令中使用进程替换来执行此操作。

完整的命令是:

grep -f <(sed -e "s/^/^/g" -e "s/$/ /g" file-2) file-1 
4

很简单使用join

join file-1 file-2 

必须将文件分类为join工作。该排序基于文本,而不是数值,因此您可能需要先将其排序为临时文件。喜欢的东西:

sort file-2 > sorted.tmp 
sort file-1 | join - sorted.tmp 
+1

如果你的shell是'bash':'join <(sort -n file),你可以使用命令subtitution而不是排序到temp文件-1)<(sort -n file-2)' - 它实际上做的是同样的事情,但有点干净。 – Sorpigal 2012-01-09 14:15:32

+1

@Sorpigal不是'sort -n'; 'join'匹配任意字符串,而不是数字,所以需要一个词典排序。一般来说,数字排序不可靠。 – 2012-01-09 14:20:14

+0

根据他的样本数据,我不认为我们在这种情况下通常需要担心。 – Sorpigal 2012-01-09 15:40:06

1

这可能会为你工作:

sed 's/.*/\/^& \/p/' file-2 | sed -nf - file-1 
1

这里是另一种方式在awk做到:

awk 'NR==FNR{a[$1];next} !($1 in a){next}1' file-2 file-1