Нахождение соответствующего значения «X» для максимального отклонения между двумя столбцами в двух разных текстовых файлах - PullRequest
0 голосов
/ 25 июня 2019

У меня есть два файла с 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 ]

1 голос
/ 25 июня 2019

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 для упрощения обработки.

вычислите каждое абсолютное значение, найдите максимальный и соответствующий максимальный индексы и напечатайте их в конце.

0 голосов
/ 25 июня 2019

Одно из множества возможностей:

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

Это не самое оптимальное решение, но, вероятно, сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...