헤더가 있는 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"
테스트에 실패 하므로 헤더 행을 명시적으로 건너뛸 필요가 없습니다 .