Monika
Monika

Reputation: 51

Finiding common lines for two files using bash


I am trying to compare two files and output a file which consists of common names for both.

File1

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

File2

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 

I want to compare the first parts of the names ** (ex:1990.A.BHT ) ** on both files and output a file which has common names with the values on 2nd column in file1 to file3

ex: file3 (output)

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

I used following codes which uses grep command

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

and

grep -wf file1 file2 > file3 

I sort the files before using this script. But I get an empty file3. Can someone help me with this please?

Upvotes: 0

Views: 408

Answers (2)

user1934428
user1934428

Reputation: 22366

In your example data, the lines appear to be in sorted order. If you can guarantee that they always are, comm -1 -2 file1 file2 would do the job. If they can be unsorted, do a

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

Upvotes: -1

Barmar
Barmar

Reputation: 782693

You need to remove everything starting from _SCS.dat from the lines in file2. Then you can use that as a pattern to match lines in file1.

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

The -F option matches fixed strings rather than treating them as regular expressions.

Upvotes: 1

Related Questions