Angelo
Angelo

Reputation: 5059

match rows from one file to columns in another file

I have two files where one file contain names in each row as follows:-

GTX-1175F-223-RGXC
GTX-1135F-223-RGXC
GTX-1145F-223-RGXC
GTX-1155F-223-RGXC
GTX-1185F-223-RGXC

Second file contains values for each of the names stated in file1 like this:

GTX-1175F-223-RGXC GTX-1135F-223-RGXC GTX-1155F-223-RGXC GTX-1175F-240-RGXC
2.3 12 5.6 4
3.4 4.5 0.8 6
3.8 89 0.2 4

Expected output

GTX-1175F-223-RGXC GTX-1135F-223-RGXC GTX-1155F-223-RGXC
2.3 12 5.6 
3.4 4.5 0.8
3.8 89 0.2 

I would like to have an output where the column names in file2 that match to row names in file 1 are extracted along with values.

If it was column matching it would have been like this

awk 'FNR==NR{ a[$1]=$0;next } ($1 in a)' file2 file1

Could anyone please help me with a one liner in awk.

Thank you

Upvotes: 1

Views: 442

Answers (2)

glenn jackman
glenn jackman

Reputation: 246754

Similar to @anubhava's answer:

awk '
  NR == FNR {seen[$1]; next}
  FNR == 1 {for (i = 1; i <= NF; i++) keep[i] = ($i in seen)}
  {
    for (i = 1; i <= NF; i++) if (keep[i]) printf "%s%s", $i, OFS
    print "" 
  }
' file{1,2}
GTX-1175F-223-RGXC GTX-1135F-223-RGXC GTX-1155F-223-RGXC
2.3 12 5.6
3.4 4.5 0.8
3.8 89 0.2

Upvotes: 2

anubhava
anubhava

Reputation: 784958

You may try this 2 pass awk solution:

awk 'FNR==NR {
   seen[$1]
   next
}
{
   s = ""
   for (i=1; i<=NF; ++i) {
      if (FNR==1 && $i in seen)
         cols[i]
      if (i in cols)
         s = (s=="" ? "" : s OFS) $i
   }
   print s
}' file1 file2

GTX-1175F-223-RGXC GTX-1135F-223-RGXC GTX-1155F-223-RGXC
2.3 12 5.6
3.4 4.5 0.8
3.8 89 0.2

Upvotes: 2

Related Questions