查找两个不同文本文件中两列之间最大偏差的对应“ X”值

时间:2019-06-25 12:38:51

标签: awk

我有两个N列数的文件,第一行有一个标题(两个文件的列标题相同)。

File1:
    Header e   f    g ...... N
    1.0    1   2    3 ...... N1
    2.0    2   2    7 ...... N1
    3.0    5   3    3 ...... N1

File2:
    Header  e   f    g ...... N
    1.0     2   2    4 ...... N2
    2.0     1   9    4 ...... N2
    3.0     12  3    6 ...... N2


I want 1st column value from File1 will be subtracted (absolute value) from 1st 
column of File2, and this way till column N as shown below:


    Header  e   f    g ...... N  
    1.0     1   0    1 ...... N1-N2 
    2.0     1   7    3 ...... N1-N2
    3.0     7   0    3 ...... N1-N2

然后,对于每一列,我需要找出最大值和相应的标题值。

例如,column e的最大值为7,对应于Header value 3

The actual desired output given that input Header value = { 3.0, 2.0, 3.0 Or 2.0 }

到目前为止,我只能减去列值并将其存储在文件中。 (打印标题时仍然有问题)

awk 'FNR==NR{for(i=2;i<=NF;i++)a[FNR"-"i]=$i;next}{printf "\n"$1" ";}
FNR>1{for(i=2;i<=NF;i++){printf $i-a[FNR"-"i]" "}}' File01.txt File02.txt | column -t -s' '> subtracted_data.txt```

2 个答案:

答案 0 :(得分:1)

awk来营救!

$ paste file1 file2 | 
  awk 'function abs(x) {return x<0?-x:x}                                                                                  
       NR>1 {n=NF/2; 
             for(i=2;i<=n;i++) 
               {v[i]=abs($i-$(i+n)); 
                if(v[i]>max[i]) {max[i]=v[i]; maxIx[i]=$1}}} 
       END {printf "{";
            for(i=2;i<n;i++) printf "%s, ",maxIx[i]
            print maxIx[n]"}"}'

{3.0, 2.0, 2.0}

使用paste组合文件以简化处理。

计算每个绝对值,找到最大值和相应的最大值索引,并在最后打印它们。

答案 1 :(得分:0)

众多可能性之一是:

awk '(NR==1){ print }    # print header
     (FNR==1){ next }    # skip header
     # read file1 in memory
     # store full line with key $1
     (NR==FNR) { a[$1]=$0; next }
     # read file2 and
     # request file1 value by key, and split in array b
     { split(a[$1],b) }
     # perform magic
     { for(i=2;i<=NF;++i) $i-=b[i] }
     { print }' file1 file2

这不是最佳解决方案,但可能会解决问题。