다른 열이 입력 값과 같을 때 한 열의 Bash 스크립트 합계

다른 열이 입력 값과 같을 때 한 열의 Bash 스크립트 합계

헤더가 있는 CSV 파일이 있습니다. 열 13의 변수가 CMD를 통해 전달할 입력과 같은 경우 여섯 번째 열의 합계를 계산하기 위해 AWK를 사용하지 않고 bash 스크립트를 만들고 싶습니다.

파일은 다음과 같습니다:

IDENTIF,RIVER,LOCATION,ERECTED,PURPOSE,LENGTH,LANES,CLEAR-G,T-OR-D,MATERIAL,SPAN,REL-L,TYPE
E2,A,25,1819,HIGHWAY,1037,2,N,THROUGH,WOOD,SHORT,S,WOOD
E7,A,27,1840,HIGHWAY,990,2,N,THROUGH,WOOD,MEDIUM,S,WOOD
E16,A,25,1859,HIGHWAY,1030,2,N,THROUGH,IRON,MEDIUM,S-F,SUSPEN

예를 들어 script.sh WOOD 를 실행하면 6열의 WOOD와 동일한 13열의 값 합계를 출력합니다.

AWK를 사용하는 많은 솔루션을 보고 즉시 해결했습니다. 나는 당신이 그것 없이도 같은 일을 어떻게 할 수 있기를 바랍니다.

내가 시도한 코드:

#!/bin/bash

skip_line = 0
total_length = 0
while IFS=, read -r -a fields 
do
if [ $skip_line eq 0 ]
then
  skip_line = $(($skip_line + 1))
  continue
fi

if [ ${fields[12]} == $1 ]
then
    total_length = $(($total_length + ${fields[5]}))
fi
done < file.csv

echo "$total_length"

답변1

SMOP.

먼저 grep행 선택을 사용하고 cut필드 추출을 사용하여 값을 합산합니다.

테스트되지 않은

#!/bin/bash
pat="$1"
export total=0
grep ",$pat," file.txt |\
  cut -d, -f6 |\
  while read num ; do
    total=$total + $num
  done
echo "$total"

답변2

이 작업을 고려하기 전에 다음을 참조하세요.쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?

=그럼에도 불구하고 귀하의 시도는 매우 가깝습니다(한 가지 분명한 문제는 과제의 주변 공백입니다 total_length).

#!/bin/bash

sum=0
while IFS=, read -a fields; do
  if [[ ${fields[12]} = "$1" ]]; then
    (( sum += fields[5] ))
  fi
done < file.csv

printf 'sum: %d\n' "$sum"

원하는 경우 if..then..fi단락 논리를 사용하는 시간을 단축할 수 있습니다.

[[ ${fields[12]} = "$1" ]] && (( sum += fields[5] ))

${fields[12]} = "$1"테스트에 실패 하므로 헤더 행을 명시적으로 건너뛸 필요가 없습니다 .

관련 정보