파일 간 산술 연산

파일 간 산술 연산

다음 두 개의 입력 파일이 있다고 가정해 보겠습니다.

> file1
2
3
4

> file2
10
100
1000

계산하고 싶습니다: 각 줄에 대해 file1/file2, 결과는 file3입니다.

> file 3
0.2
0.03
0.004

Bash의 분할은 다음을 통해 달성할 수 있습니다.$((file1_line/file2_line))

답변1

A paste와 A 의 조합은 bc간단한 산술을 위한 좋은 선택입니다.

paste -d/ file1 file2 | bc -l

산출:

.2000000000
.0300000000
.0040000000

좀 더 발전된 예

몇 가지 트릭을 사용하면 더욱 정교해질 수 있습니다. 다음을 포함한다고 합니다 file3:

6
7
8

다음을 수행 할 수 있습니다 (file1 + file3) / file2.

paste -d'(+)/' /dev/null file1 file3 /dev/null file2

산출:

(2+6)/10
(3+7)/100
(4+8)/1000

paste이는 루프가 각 줄의 구분 기호 목록을 반복하기 때문에 작동합니다 .

0으로 나누는 반응

잘못된 작업이 전송되면 bc경고가 표준 오류로 전송됩니다. 이를 다른 파일로 리디렉션하고 해당 내용에 따라 프로그램 흐름을 결정할 수 있습니다. 예를 들면 다음과 같습니다.

paste -d/ file1 file2 | bc -l > resultfile 2> errorfile
if grep -q 'Divide by zero' errorfile; then
  echo "Error in calculation"
else
  echo "All is well"
fi

또는 오류가 있는 경우:

paste -d/ file1 file2 | bc -l > resultfile 2> errorfile
if ! file errorfile | grep -q empty; then
  echo "Error in calculation"
else
  echo "All is well"
fi

답변2

에서 시작하다

 paste file1 file2 | awk '{printf "%f\n",$1/$2 } '

어디

  • paste파일 "병합"
  • awk분할은 한 번에 하나씩 계산됩니다.

후행 0이 너무 많은 것이 마음에 들지 않으면 추가하십시오.

... | sed -e s/0*\$//

다음과 같은 경우 종료0

paste file1 file2 | awk '!$2 {exit ; }  {printf "%f\n",$1/$2 } '

관련 정보