2017-02-10 52 views
1

我希望在awk中通過兩個輸入文件的產物創建文件。在awk中使用兩個文件中的乘法生成創建文件

文件1擁有850,000行和50,001列的SNP數據。第一列是在文件1 3行與ID與id

實施例和第一4個SNP

A 1 2 1 2 
B 2 2 2 1 
C 1 1 1 1 

文件2具有1行的50000個SNP影響。

0.2 -0.1 0.4 0.5 

我的期望的輸出是id和的每個SNP倍SNP作用的總和即

A將是1*0.2 + 2*-0.1 + 1*0.4 + 2*0.5 = 1.4

A 1.4 
B 1.5 
C 1 

任何幫助,將不勝感激。

羅迪

+0

50K要素矢量和產品都容易出現舍入誤差,可能要注意求和秩序。 – karakfa

回答

3

這AWK的一行應該爲你工作:

awk 'NR==FNR{split($0,a);next}{s=0;for(i=2;i<=NF;i++)s+=a[i-1]*$i;print $1,s}' file2 file1 
3

您可以使用以下awk腳本:

awk 'FNR==NR{split($0,a);next}{t=0;for(i=2;i<=NF;i++){t+=$i*a[i-1]};print $1,t}' b.txt a.txt 

更好的可讀性爲多版本:

calc.awk

# True for the first input file (the one with the factors) 
# See: https://www.gnu.org/software/gawk/manual/html_node/Auto_002dset.html#Auto_002dset 
FNR==NR{ 
    # split factors into array a 
    split($0,a) 
    next 
} 
{ 
    t=0 # total 
    # Iterate through fields 
    for(i=2;i<=NF;i++){ 
     # ... and aggregate t 
     t+=$i*a[i-1] 
    } 
    print $1,t # Output the id along with t 
} 

這樣稱呼它:

awk -f calc.awk b.txt a.txt