Вычтите все записи в одном файле из соответствующих записей в другом файле без учета пропущенного значения.

У меня есть два файла с одинаковым количеством строк и столбцов. Я хотел бы вычесть все записи в одном файле из соответствующих записей в другом файле без учета недостающих значений. например

ifile1.txt    
3  5  2  2
1  ?  2  1
4  6  5  2
5  5  7  1

ifile2.txt
1  2  1  3
1  3  0  2
2  ?  5  1
0  0  1  1

Здесь "?" является отсутствующим значением и не должно учитываться при вычислениях.

ofile.txt i.e. [(ifile1.txt) - (ifile2.txt)]
2.00  3.00  1.00 -1.00 
0.00  ?     2.00 -1.00 
2.00  ?     0.00  1.00 
5.00  5.00  6.00  0.00 

Я мог сделать это без каких-либо пропущенных значений следующим образом. Но не может добиться успеха с отсутствующим значением, как здесь "?".

paste ifile1.txt ifile2.txt > ifile3.txt
awk '{n=NF/2; for (i=1;i<=n;i++) printf "%5.2f ", $i-$(i+n); print ""}' ifile3.txt > ofile.txt

person Kay    schedule 27.10.2016    source источник


Ответы (2)


не тестировал, но что-то вроде этого должно работать

$ paste ifile1.txt ifile2.txt |
  awk -v q='?' '{n=NF/2; 
                 for(i=1;i<=n;i++) 
                   printf "%5s ", (($i==q||$(i+n)==q)?q:$i-$(i+n)); 
                 print ""}' > ofile.txt
person karakfa    schedule 27.10.2016
comment
Спасибо вам большое за вашу поддержку. Это дает ноль 0 значений вместо пропущенных? из-за форматирования. Поэтому я использовал printf% 5s вместо printf% 5.2f. Работает нормально. - person Kay; 27.10.2016

Я начал играть, как читать 2 файла одновременно, т.е. как потерять paste. В awk:

$ cat mm.awk
NR>FNR { exit }                       # after file1 exit
{
    split($0,a," ")                   # split record from file1 to array a
    getline < ARGV[2]                 # read record from the file2
    for(i=1;i<=NF;i++)                # one for for both 
        printf "%s%s", ( a[i]!="?" && $i!="?" ? a[i]-$i : "?" ), ( i==NF ? ORS : OFS )
}                                     # on prev rec, if "?" in either, output "?"

Запустить его:

$ awk mm.awk file1 file2
2 3 1 -1
0 ? 2 -1
2 ? 0 1
5 5 6 0
person James Brown    schedule 27.10.2016