2016-10-27 2 views
0

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

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 

ответ

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 
+0

Большое спасибо за вашу поддержку. Это дает нулевые значения «0» вместо отсутствия «?» из-за форматирования. Поэтому вместо printf "% 5.2f" я использовал printf "% 5s". Работает нормально. – Kay

1

Я начал играть примерно как читать 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 
Смежные вопросы