kornshell에서 특정 날짜별로 지정된 열의 값을 합산하는 방법은 무엇입니까?

kornshell에서 특정 날짜별로 지정된 열의 값을 합산하는 방법은 무엇입니까?

저는 데이터의 유효성을 검사하기 위해 고유한 유효성 검사 프레임워크를 사용하고 있습니다. 각 확인 작업에는 SQL 작업과 그에 수반되는 KSH 작업(kornshell)이 있습니다. SQL은 데이터베이스의 내용을 쿼리하므로 KSH는 데이터 파일을 쿼리하기 위해 DB(SQL)와 동일한 논리를 사용해야 합니다.

현재 SQL 문은 하드코딩된 날짜를 기준으로 집계 열의 합계를 쿼리하고 값을 제공합니다. 아래 KSH 파일에서 해당 콘텐츠를 어떻게 복사할 수 있나요?

현재 내 KSH 코드는 다음과 같습니다.

cat /textfile.txt | > ${OUTPUT_FILE}

따라서 이 KSH가 해야 할 일은 주어진 날짜에 대한 특정 열의 합계를 제공하는 것입니다. 해당 날짜에 대한 기록이 여러 개 있을 것입니다.

예시 데이터:

Date  | Money
--------------
1/1/15 : $15
2/2/15 : $14
3/3/16 : $25
etc... : etc...

예상 출력:2015년 1월 1일부터 2015년 1월 31일까지의 총액(금액)입니다.

답변1

정확한 구문은 정확한 입력에 따라 달라집니다. 값 필드가 항상 시작되면 <space><dollar>awk 문을 사용할 수 있습니다.

awk -F: '$2 ~ /^ \$/ { a[$1]+=substr($2,3)} END {for (b in a) { print b"$"a[b]}}'

예를 들어

awk -F: '$2 ~ /^ \$/ { a[$1]+=substr($2,3)} END {for (b in a) { print b"$"a[b]}}' testfile.txt
3/3/16 $25
2/2/15 $14
1/1/15 $15

참고: 구분 기호가 실제로 a이고 |a가 아닌 경우에는 를 :수행해야 합니다 awk -F'|' ....

작동 방식은 다음과 같습니다.

$2 ~ /^ \$/ -- 두 번째 필드로 시작하는 각 줄에 대해<space><dollar>

{ a[$1]+=substr($2,3)}-- 두 번째 필드의 내용(처음 두 문자 제외)을 날짜별로 인덱스된 배열에 추가합니다.

END {for (b in a) { print b"$"a[b]}}'-- 파일이 끝나면 우리가 찾은 모든 날짜를 살펴보고 합계를 인쇄합니다.

따라서 기본적으로 a배열은 날짜별로 인덱싱되며 해당 날짜에 대한 값의 합계를 포함합니다.

답변2

글쎄, ksh에서 필요한 경우 다음 예제가 도움이 될 수 있습니다.

내가 사용한 데이터 파일:

Date  | Money
--------------
1/1/15 : $15
2/2/15 : $14
3/3/16 : $25
1/2/15 : $10
2/1/15 : $35
3/2/15 : $7

암호:

#!/bin/ksh

typeset -A SUM_ARRAY

IN_FILE="$1"

if [[ -z $IN_FILE ]]; then
        print "Usage : script.sh {input filename}"
        exit
fi


while read line;
do
        temp_array=($line)
        if [[ ! ${temp_array[0]} =~ ^(-*)$ && ${temp_array[0]} != "Date" ]]; then
                idx=$(date -d ${temp_array[0]} +"%Y%m")
                SUM_ARRAY[$idx]=$((${SUM_ARRAY[$idx]}+${temp_array[2]#\$*}))
        fi
done < $IN_FILE

print "YearMonth\tSum"

for idx in ${!SUM_ARRAY[@]}; do
        print "$idx\t\t${SUM_ARRAY[$idx]}"
done

결과:

YearMonth       Sum
201501          25
201502          49
201503          7
201603          25

관련 정보