How to match 2 columns where one column has data as a range - extended


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers How to match 2 columns where one column has data as a range - extended
# 1  
Old 09-19-2011
How to match 2 columns where one column has data as a range - extended

Dear all,

there is a nice solution for a text merge where the second file has only variables with a numeric range ( sorry, cannot post URL + thread is closed ). The real world is however more complicated than in the earlier example.

file1
Code:
A 1
A 2
A 3
B 1
B 2
B 3
B 4
C 1
C 2
C 3
C 4

file 2
Code:
A Gene1 1 2
A Gene2 3 4 
A Gene3 5 6
B Gene4 1 2
C Gene5 3 4

output file required
Code:
A 1 Gene1
A 2 Gene1
A 3 Gene2
B 1 Gene4
B 2 Gene4
B 3 -
B 4 -
C 1 -
C 2 -
C 3 Gene5
C 4 Gene5

The earlier code

Code:
awk 'NR==FNR{a[$1]=$2;b[$1]=$3;c[$1]=$4;next}
a[$1] && $2 >= b[$1] && $2 <= c[$1]{print $0 FS a[$1];next}
{print $0 FS " -"}' file2 file1

doesn't consider multiple occurrences of A. Can you help with an update?

Last edited by underscore; 09-19-2011 at 07:20 AM.. Reason: mixed code and quote
# 2  
Old 09-19-2011
Code:
awk 'NR==FNR{a[$1 FS $3]=$2;b[$1 FS $4]=$2;next}
 {print (a[$0] || b[$0]?$0 FS a[$0] b[$0]:$0 FS "-")}' file2 file1

This User Gave Thanks to malcomex999 For This Post:
# 3  
Old 09-19-2011
thank you

@malcomex999 I am really grateful as my attempts over several hours were unsuccessful. You saved my day :

Last edited by underscore; 09-19-2011 at 09:20 AM.. Reason: typo
# 4  
Old 09-20-2011
Error range not always recognized

Hi - found some errors when running a large dataset. Consider a slightly modified

file 2

Code:
A Gene1 1 2
A Gene2 3 4 
A Gene3 5 6
B Gene4 1 5
C Gene5 3 4

Range of Gene4 is not correctly recognized. Can you replicate that?
# 5  
Old 09-22-2011
I think one of main misunderstandings in the approach above is the fact that it doesn't know the address in the associative array. So I am reversing now the input files, combining the best of all worlds and voila

Code:
awk 'NR==FNR { a[$2 FS $3]=$2; b[$2 FS $3]=$3; c[$2 FS $3]=$0; next} {for (i=$3;i<=$4;i++) if (c[$1 FS i]) {d[$1 FS i]=$2} } END {for (i in a) print (d[i]?c[i] FS d[i]:c[i] FS " -" ) }' file1 file2

might be a solution. Haven't tested it extensively so far, so be careful.
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Data match 2 files based on first 2 columns matching only and join if match

Hi, i have 2 files , the data i need to match is in masterfile and i need to pull out column 3 from master if column 1 and 2 match and output entire row to new file I have tried with join and awk and i keep getting blank outputs or same file is there an easier way than what i am... (4 Replies)
Discussion started by: axis88
4 Replies

2. Shell Programming and Scripting

Match first two columns and calculate percent of average in third column

I have the need to match the first two columns and when they match, calculate the percent of average for the third columns. The following awk script does not give me the expected results. awk 'NR==FNR {T=$3; next} $1,$2 in T {P=T/$3*100; printf "%s %s %.0f\n", $1, $2, (P>=0)?P:-P}' diff.file... (1 Reply)
Discussion started by: ncwxpanther
1 Replies

3. Shell Programming and Scripting

Compare 2 files and match column data and align data from 3 column

Hello experts, Please help me in achieving this in an easier way possible. I have 2 csv files with following data: File1 08/23/2012 12:35:47,JOB_5330 08/23/2012 12:35:47,JOB_5330 08/23/2012 12:36:09,JOB_5340 08/23/2012 12:36:14,JOB_5340 08/23/2012 12:36:22,JOB_5350 08/23/2012... (5 Replies)
Discussion started by: asnandhakumar
5 Replies

4. Shell Programming and Scripting

Match words and fetch data in front of it in second column

Hi all, I have 2 files one file contain data like this in one column AST3 GSTY4 JST3 second file containign data like this in 2 columns AST3(PAXXX),GSTY4(PAXXY) it is used in diabetes KST4 it is used in blood... (6 Replies)
Discussion started by: manigrover
6 Replies

5. Shell Programming and Scripting

Match same file column data

File A B07 U51C 4434 L662C 4412 B07 L64U 612 L651B 4434 B07 L11C 4434 R151B 4434 B05 L12Z 612 L51B 4434 B01 651Z 612 L651C 4434 B04 A51Z 612 L51A 4434 L07 B08D 4434 B1B 4434 B07 RU8D 4434 L51A 4434 B07 L58D 4434 B51C 4434 B07 LA8D 4434 L4B 4434 Now i want File B Output B07... (2 Replies)
Discussion started by: asavaliya
2 Replies

6. Shell Programming and Scripting

Splitting the data in a column into several columns

Hi, I have the following input file 32895901-d17f-414c-ac93-3e7e0f5ec240 AND @GDF_INPUT 73b129e1-1fa9-4c0d-b95b-4682e5389612 AUS @GDF_INPUT 40f82e88-d1ff-4ce2-9b8e-d827ddb39447 BEL @GDF_INPUT 36e9c3f1-042a-43a4-a80e-4a3bc2513d01 BGR @GDF_INPUT I want to split column 3 into two columns:... (1 Reply)
Discussion started by: ramky79
1 Replies

7. Shell Programming and Scripting

awk to match a numeric range specified by two columns

Hi Everyone, Here's a snippet of my data: File 1 = testRef2: A1BG - 13208 13284 AAA1 - 34758475 34873943 AAAS - 53701240 53715412File 2 = 42MLN.3.bedS2: 13208 13208 13360 13363 13484 13518 13518My awk script: awk 'NR == FNR{a=$1;next} {$1>=a}{$1<=a}{print... (5 Replies)
Discussion started by: heecha
5 Replies

8. UNIX for Dummies Questions & Answers

How to match 2 columns where one column has data as a range

Hi, I have a query about joining files using data ranges. Example files below - I want to join file1 to file2 with matches where file1 column 1 is equal to file2 column1, and file1 column 2 is within the range of file2 columns 3 and 4. I would like rows which don't match to be printed too. ... (4 Replies)
Discussion started by: auburn
4 Replies

9. Shell Programming and Scripting

Extract data based on match against one column data from a long list data

My input file: data_5 Ali 422 2.00E-45 102/253 140/253 24 data_3 Abu 202 60.00E-45 12/23 140/23 28 data_1 Ahmad 256 7.00E-45 120/235 140/235 22 data_4 Aman 365 8.00E-45 15/65 140/65 20 data_10 Jones 869 9.00E-45 65/253 140/253 18... (12 Replies)
Discussion started by: patrick87
12 Replies

10. UNIX for Dummies Questions & Answers

two files.say a and b.both have long columns.i wanna match the column fron 1st file w

ex: a file has : 122323 123456456 125656879 678989965t635 234323432 b has : this is finance no. this is phone no this is extn ajkdgag idjsidj i want the o/p as: 122323 his is finance no. 123456456 this is phone no 123456456 ... (4 Replies)
Discussion started by: TRUPTI
4 Replies
Login or Register to Ask a Question