我有这种文件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
有人可以帮忙吗?
答案 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