记录过滤

时间:2012-01-09 11:05:08

标签: linux shell sed awk

我有这种文件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

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

使用join非常简单:

join file-1 file-2

必须对文件进行排序才能使join生效。排序基于 text ,而不是数值,因此您可能需要先排序到临时文件。类似的东西:

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

答案 2 :(得分:1)

您可以使用grep中的-f选项来读取文件中的模式。但首先,您必须更改模式,使它们仅匹配第一个字段。您可以使用sed在文件-2的开头添加^,在文件-2中添加每个模式末尾的空格,并在命令中使用进程替换。

完整的命令是:

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

答案 3 :(得分:1)

这可能对您有用:

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

答案 4 :(得分:1)

以下是awk中的另一种方法:

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