使用 bash 查找两个文件的公共行

问题描述


我正在尝试比较两个文件输出一个包含两个文件的通用名称文件

文件 1

1990.A.BHT.s_fil 4.70 
1991.H.BHT.s_fil 2.34 
1992.O.BHT.s_fil 3.67 
1993.C.BHT.s_fil -1.50
1994.I.BHT.s_fil -3.29 
1995.K.BHT.s_fil -4.01

文件 2

1990.A.BHT_ScS.dat 1537  -2.21
1993.C.BHT_ScS.dat 1494  1.13
1994.I.BHT_ScS.dat 1545  0.15
1995.K.BHT_ScS.dat 1624  1.15 

我想比较两个文件名称 ** (ex:1990.A.BHT ) ** 的第一部分,并输出一个文件,该文件名称与 file1 到 file3 中第二列的值具有共同的名称

例如:file3(输出

1990.A.BHT.s_fil 4.70 
1993.C.BHT.s_fil -1.50
1994.I.BHT.s_fil -3.29
1995.K.BHT.s_fil -4.01

我使用了以下使用 grep 命令的代码

while read line 
do
grep $line file1 >> file3
done < file2

grep -wf file1 file2 > file3 

我在使用这个脚本之前对文件进行了排序。 但是我得到一个空的 file3。有人可以帮我吗?

解决方法

您需要从 _SCS.dat 中的行中删除从 file2 开始的所有内容。然后你可以使用它作为模式来匹配 file1 中的行。

grep -F -f <(sed 's/_SCS\.dat.*//' file2) file1 > file3

-F 选项匹配固定字符串,而不是将它们视为正则表达式。

,

在您的示例数据中,这些行似乎是按排序顺序排列的。如果您能保证它们总是如此,comm -1 -2 file1 file2 就可以完成这项工作。如果它们可以未排序,请执行

comm -1 -2 <(sort file1) <(sort file2)