从另一个文件中的相应条目中减去一个文件中的所有条目,而不考虑缺失值

时间:2016-10-27 00:49:32

标签: linux shell awk subtraction

我有两个行数和行数相同的文件。我想从另一个文件中的相应条目中减去一个文件中的所有条目,而不考虑缺失值。 e.g。

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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