Reputation: 5059
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
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
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