user3324491
user3324491

Reputation: 559

print and match rows where two columns match between two files

I want to match column 1 and 2 from the file for_matching with files in different directories in the path and named /.file and print the entire row that matches those columns

/.file (example)

carrot 124555 1 2 6
hair 9922 2 2 2
tree 2223 2 1 2

for_matching

carrot 124555

output

carrot 124555 1 2 6

Right now I can just match column 1 between the two.

for i in */*.file; do awk -F, 'FNR==NR {a[$1]=$0; next}; $1 in a {print a[$1]}' $i for_matching > $i.matched; done

Upvotes: 1

Views: 1628

Answers (2)

James Brown
James Brown

Reputation: 37394

That is so simple that you could just:

$ grep -F -w -f for_matching file
carrot 124555 1 2 6

For a limitation see @karakfa's comment below.

That could of course be circumvented with (:

$ cat file
carrot 124555 1 2 6
1 carrot 124555 1 2 6

$ grep -w -f <(sed 's/^/^/g' for_matching) file
carrot 124555 1 2 6

Upvotes: 1

Akshay Hegde
Akshay Hegde

Reputation: 16997

Using awk

awk 'FNR==NR{arr[$1,$2];next}(($1,$2) in arr)' for_matching file

Test Results:

$ cat file
carrot 124555 1 2 6
hair 9922 2 2 2
tree 2223 2 1 2

$ cat for_matching 
carrot 124555

$ awk 'FNR==NR{arr[$1,$2];next}(($1,$2) in arr)' for_matching file
carrot 124555 1 2 6

Same with multiple files, no need of ls */*.file

#!/usr/bin/env bash

for i in */*.file; do
    awk 'FNR==NR{arr[$1,$2];next}(($1,$2) in arr)' for_matching "$i" >"$i.matched"
done

Upvotes: 2

Related Questions