0

I am new to awk and trying to compare ":" separated columns 1(eg., chr10) and 2 (eg 10000003) between file1 and file 2 ; and write the matching lines into a new file using awk.

File 1:

chr10:10000003
chr10:10000005
chr10:10000015
chr10:10000017
chr10:100000202
chr10:10000033
chr10:100000380
chr10:10000043
chr10:100000465
chr10:10000052

File 2:

chr1:1806476:T/C:   -2.12680332451125   0.835119313863368\
chr1:1806503:A/C:   -1.56871277809939   0.764924263070418\
chr10:10000003:C/T: -0.572267893158369  0.607055146639116\
chr1:1825420:C/T:   1.70588504817348    0.22407517592607\
chr1:2019496:G/C:   2.34709890656509    0.147215274051584\
chr1:2019501:C/T:   -2.06157612494769   0.82769600171016\
chr10:100000202:C/A:    0.808838763489275   0.362093542746135\
chr1:2028192:G/A:   -0.164564659049733  0.534780784989026\
chr1:2029672:C/A:   -1.31298871130864   0.727940863740118\
chr1:2228889:C/G:   -1.570481759004 0.765170049967457\
chr10:100000465:C/T:    -0.701703282910107  0.629368417133545\
chr1:2306256:C/T:   -1.72965371800758   0.786695642291442\

Expected output: The matched lines from file 2 in the same format as file 2 (attached above)

chr10:10000003:C/T: -0.572267893158369  0.607055146639116\
chr10:100000202:C/A:    0.808838763489275   0.362093542746135\
chr10:100000465:C/T:    -0.701703282910107  0.629368417133545\

The commands tried so far:

awk -F":\r" 'NR==FNR{a[$1$2]++;next}{if($1$2 in a){print}}' file1.txt file2.txt > output.txt
awk -F":\r" 'NR==FNR{a[($1$2)]++;next}{if(($1$2) in a){print}}' file1.txt file2.txt > output.txt

Error observed is a blank output.txt

Could you please help me point out the mistake?

Thanks in Advance!

  • Change every $1$2 to ($1,$2) since you need a separator to create a unique key from 2 fields (without a separator a bc -> abc and ab c -> abc) but more importantly - there are no matches between file1 and file2 in the example you posted. Every $1 in file1 is chr10 while every $1 in file2 is chr1. Please edit your question to show concise, testable, textual sample input/output. No images and no links - just text we can copy/paste to test with. – Ed Morton Feb 11 at 7:18
  • @ Ed Morton: Thanks for your inputs. I have edited the question post. I also tried implementing the recommended solution, the output file is still blank. Could you please have a look. – Gul Feb 12 at 0:56
  • Thanks! This worked : awk -F'[:\r]' 'NR==FNR{a[$1];next}($1 in a){print $0}' file1.txt file2.txt – Gul Feb 12 at 1:11
  • You misread my comment. I didn't say "change $1$2 to ($1$2)", I said "change $1$2 to ($1,$2)". The , separator is the most important part as explained in my comment. Using -F":\r" makes no sense - think about what that actually means. -F"[:\r]" also makes no sense for what you're trying to do since you don't have any \r-separated fields. The solution you say works for you doesn't at all do what you asked for so idk why you think it works. – Ed Morton Feb 12 at 21:21
0

You can use below command Let me know for any doubts

awk 'NR==FNR{a[$1];next}($1 in a){print $0}'  file1 file2
| improve this answer | |
  • The above command is not working for me. I have edited the question in detail now, could you please give it a shot? – Gul Feb 12 at 0:53
0

This is what you really need:

$ awk -F':' 'NR==FNR{a[$1,$2]; next} ($1,$2) in a' file1 file2
chr10:10000003:C/T: -0.572267893158369  0.607055146639116\
chr10:100000202:C/A:    0.808838763489275   0.362093542746135\
chr10:100000465:C/T:    -0.701703282910107  0.629368417133545\
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.