저는 데이터의 유효성을 검사하기 위해 고유한 유효성 검사 프레임워크를 사용하고 있습니다. 각 확인 작업에는 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