2016-10-27 2 views
0

동일한 수의 행과 열을 가진 두 개의 파일이 있습니다. 누락 된 값을 고려하지 않고 한 파일의 모든 항목을 다른 파일의 correspondng 항목에서 뺍니다. 예 :누락 된 값을 고려하지 않고 한 파일의 모든 항목을 다른 파일의 해당 항목에서 뺍니다.

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"대신에 "0"값을 제공합니다. 형식화 때문입니다. 그래서 printf "% 5.2f"대신 printf "% 5s"를 사용했습니다. 잘 작동합니다. – Kay

1

이 같은 작동합니다. paste을 푸는 방법.

$ 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에서

$ awk mm.awk file1 file2 
2 3 1 -1 
0 ? 2 -1 
2 ? 0 1 
5 5 6 0 
관련 문제