2015-04-07 41 views
1

我有以下兩個文件:AWK設置變量,使一系列

文件1:

1 290 rs1345 
2 450 rs5313 
1 1120 rs4523 
2 790 rs4325 

文件2:

1 201 LDLR 
2 714 APOA5 
1 818 NOTCH5 
1 514 TTN 

我想孤立僅在文件中的行2其中第二個字段在文件1中的第二個字段的100個單元內(如果字段1匹配):

期望的輸出:(n注意第三個字段來自file1中的匹配行)。

1 201 LDLR rs1345 
2 714 APOA5 rs4325 

我嘗試使用下面的代碼:

for i in {1..4} #there are 4 lines in file2 
do 
chr=$(awk 'NR=="'${i}'" { print $1 }' file2) 
pos=$(awk 'NR=="'${i}'" { print $2 }' file2) 
gene=$(awk 'NR=="'${i}'" { print $3 }' file2) 

start=$(echo $pos | awk '{print $1-100}') #start and end variables for 100 unit range 
end=$(echo $pos | awk '{print $1+100}') 
awk '{if ($1=="'$chr'" && $2 > "'$start'" && $2 < "'$end'") print "'$chr'","'$pos'","'$gene'"$3}' file1 
done 

的代碼不工作,我相信什麼是錯的我開始和結束的變量,因爲當我回聲$開始,我得到414,這對我來說沒有任何意義,當我回聲$結束時我得到614。

我明白這個問題可能很難理解,所以請問我是否需要澄清。

謝謝。

+2

你可以在awk中完成這一切,而不是awk和shell的混亂。將第一個文件的內容加載到數組中,然後在循環第二個文件時使用它。 –

+1

如果文件1中的_any_行具有匹配的字段1和範圍在100的字段2,您希望從文件2打印行?如果文件1中的多行具有匹配的字段1和100內的字段2,該怎麼辦? – jas

回答

2

的困難在於$ 1不是唯一的關鍵,所以一些護理需要與數據結構要採取的數據存儲在文件1.

隨着GNU AWK,你可以使用數組的數組:

gawk ' 
    NR==FNR {f1[$1][$2] = $3; next} 
    $1 in f1 { 
     for (val in f1[$1]) 
      if (val-100 <= $2 && $2 <= val+100) 
       print $0, f1[$1][val] 
    } 
' file1 file2 

否則,您必須使用一維數組和東西2條信息到關鍵:

awk ' 
    NR==FNR {f1[$1,$2] = $3; next} 
    { 
     for (key in f1) { 
      split(key, a, SUBSEP) 
      if (a[1] == $1 && a[2]-100 <= $2 && $2 <= a[2]+100) 
       print $0, f1[key] 
     } 
    } 
' file1 file2 

與mawk和NAWK(和GAWK)的作品

0
#!/usr/bin/python 

import pandas as pd 
from StringIO import StringIO 

file1 = """ 
1 290 rs1345 
2 450 rs5313 
1 1120 rs4523 
2 790 rs4325 
""" 

file2 = """ 
1 201 LDLR 
2 714 APOA5 
1 818 NOTCH5 
1 514 TTN 
""" 

sio = StringIO(file1) 
df1 = pd.read_table(sio, sep=" ", header=None) 
df1.columns = ["a", "b", "c"] 

sio = StringIO(file2) 
df2 = pd.read_table(sio, sep=" ", header=None) 
df2.columns = ["a", "b", "c"] 

df = pd.merge(df2, df1, left_on="a", right_on="a", how="outer") 

#query is intuitive 
r = df.query("b_y-100 < b_x <b_y + 100") 
print r[["a", "b_x", "c_x", "c_y"]] 

輸出:

a b_x c_x  c_y 
0 1 201 LDLR rs1345 
7 2 714 APOA5 rs4325 

大熊貓是做這樣的表格數據操作的工具。