I want to create a file that contains columns from two input files. File1 is like:
aa 32
bb 15
cc 78
File2 is:
fa 19
bc 23
cc 50
de 28
aa 45
bb 31
The task is, read through File1, if the 1st field of a row exists among the 1st field of File2, then print that line of File2, with both columns and add the 2nd column entry of File1 containing the 1st field.
The output should be like:
aa 45 32
bb 31 15
cc 50 78
awk is preferred for the script.
Best Answer
Explanation:
awk
implicitly loops through each file, one line at a time. Since we gave itfile2
as the first argument, it is read first.file1
is read second.FNR==NR{a[$1]=$2;next}
NR
is the number of lines thatawk
has read so far andFNR
is the number of lines thatawk
has read so far from the current file. Thus, ifFNR==NR
, we are still reading the first named file:file2
. For every line infile2
, we assigna[$1]=$2
.Here,
a
is an associative array anda[$1]=$2
means saving file2's second column, denoted$2
, as a value in arraya
using file2's first column,$1
, as the key.next
tellsawk
to skip the rest of the commands and start over with the next line.($1 in a) {print $1,a[$1],$2}
If we get here, that means that we are reading the second file:
file1
. If we saw the first field of the line infile2
, as determined by the contents of arraya
, then we print out a line with the values of field 2 from both files.