열에서 숫자를 읽고 함께 추가하는 방법

열에서 숫자를 읽고 함께 추가하는 방법

데이터 및 bss 섹션 아래의 명령줄에 있는 파일 크기 정보에 숫자를 추가할 수 있기를 원합니다.

./script.sh [file name]

지금까지 쉘 스크립트를 다음과 같이 작성했습니다.

ExcPath=$1 #read file name from command line
Numberone= size $1 | $data #put data column into Numberone
Numbertwo= size $1 | $bss #put bss column into Numbertwo
sum=$(( $Numberone + $Numbertwo )) # calculate the sum of DATA and BSS
echo $sum 

$data그리고 $bss쉘이 "data" 및 "bss" 열에서 읽는 것으로 생각되는 변수는 무엇입니까?

출력 size test:

text   data    bss    dec    hexfile name
2231    600      8   2839      b17   test

내 스크립트를 실행한 후 예상되는 출력은 다음과 같습니다.

608

쉘 스크립트에서 이를 어떻게 달성할 수 있습니까? 내가 뭘 잘못했나요?

답변1

귀하의 스크립트가 완전히 잘못된 것 같습니다. 시간을 내어 쉘 스크립팅에 대한 몇 가지 기본 자습서를 읽어서 수행해야 할 작업을 파악하십시오. 실제로 필요하다는 점에 유의하세요.읽다파일을 변수에 넣는 대신에.

이런 종류의 일을 처리하는 가장 일반적인 도구는 다음과 같습니다 awk.awk

$ awk 'NR>1{print $2+$3}' file
608

NR은 현재 줄 번호이고 $N현재 줄의 N번째 필드입니다. 따라서 명령은 awk첫 번째 줄( NR>1)을 건너뛰고 두 번째와 세 번째 필드의 합계를 인쇄하도록 지시합니다.


껍데기끔찍한 도구다파일을 구문 분석하기 위해 셸에서 반드시 수행해야 하는 경우 다음을 시도해 볼 수 있습니다.

#/bin/bash

ExcPath=$1

## Now, skip the first line and read the rest
tail -n+2 "$ExcPath" |
  ## split on whitespace and save in the variables 
  while read text data bss dec hexfile name; do
    echo $(( $data + $bss))
  done

다른 이름으로 저장 script.sh하고 ./script.sh filename다음과 같이 실행하세요.

$ ./script.sh file
608

답변2

주문하다

z=0;for l in `awk '{for(i=1;i<=NF;i++){if($i ~ /data|bss/){print i}}}' filename`; do m=`awk -v l="$l" 'BEGIN{sum=0}{sum=sum+$l}END{print sum}' p`;z=$(($z+$m)); done;echo $z

산출

608

관련 정보