join - Comparison of columns from two files and create new column -


i want compare first 2 columns file1.txt , file2.txt, if match found add new columns (3rd , 4th) file1.txt values found column 3 , 4 of file2.txt , "na" non-match.

file1.txt

ch1  100 ch1  200 ch3  100 ch4  200 

file2.txt

ch1  100  0.5  0.6 ch1  200  0.1  1.2 ch3  400  0.2  0.9 ch4  200  1.0  3.0 

outputfile.txt

ch1  100  0.5  0.6 ch1  200  0.1  1.2 ch3  100  na   na ch4  200  1.0  3.0 

i tried join/awk commands not giving desired output.

the standard awk technique reads whole of file1.txt memory. if files big fit, considerably more effort required (but can done so).

awk 'fnr == nr { k[$1,$2] = 1; next }      { if (k[$1,$2] == 1) { print $0; k[$1,$2] = 2 } }      end { (i in k) { if (k[i] == 1) { sub(subsep, " ", i); print i, "na", "na" } } }' \     file1.txt file2.txt 

the first line reads first file , records keys read. second line of processing. if key of $1, $2 in second file matches record, print $0, , record key matched (by setting value 2 1). third line (the end block) looks @ keys in k , if value not 2, not matched key printed 2 na columns. sub(subsep, " ", i) part fixes sub-separator between 2 keys in i space.

raw output awk:

ch1  100  0.5  0.6 ch1  200  0.1  1.2 ch4  200  1.0  3.0 ch3 100 na na 

after passing through column -t (on mac):

ch1  100  0.5  0.6 ch1  200  0.1  1.2 ch4  200  1.0  3.0 ch3  100  na   na 

Comments

Popular posts from this blog

python - pip install -U PySide error -

arrays - C++ error: a brace-enclosed initializer is not allowed here before ‘{’ token -

cytoscape.js - How to add nodes to Dagre layout with Cytoscape -