Skip to content

Instantly share code, notes, and snippets.

@thatseeyou
Last active August 7, 2016 15:32
Show Gist options
  • Save thatseeyou/df2bd7d35e643472291693cdf6efe6ca to your computer and use it in GitHub Desktop.
Save thatseeyou/df2bd7d35e643472291693cdf6efe6ca to your computer and use it in GitHub Desktop.
파일의 각 라인을 분류해서 부분합을 구하는 bash 연습문제. 여러가지 풀이법이 가능하다.
#!/bin/bash
#
# input 파일 형식
# name value
# 공백은 무시
#
# sort를 해서 같은 name끼리 먼저 모아준다.
# 이름이 변경되는 시점에 기존 name에 대한 sub total을 찍어준다.
while read name value;do
if [ -z "$name" ];then
continue
fi
#echo "[input] $name $value"
if [[ $current_key = $name ]];then
let sub_total+=value
else
if [[ -n $current_key ]];then
echo $current_key $sub_total
fi
current_key=$name
sub_total=$value
fi
done < <(sort)
echo $current_key $sub_total
#!/bin/bash
#
# input 파일 형식
# name value
# 공백은 무시
#
declare -A summary
while read name value;do
if [ -z "$name" ];then
continue
fi
#echo $name $value
let summary[$name]+=value
#echo "${summary[$name]}=$value"
done
for key in ${!summary[@]};do
echo "$key ${summary[$key]}"
done
#!/bin/bash
#
# input 파일 형식
# name value
# 공백은 무시
#
# 아래와 같이 2개의 indexed array로 구성한다.
# names sub_totals
# 0 oh 80
# 1 park 90
# 2 kang 130
# 3 choi 130
declare -a names
declare -a sub_totals
# names=("oh" "park" "kim" "choi")
# echo $(find_index_by_name park)
# -> 1
# echo $(find_index_by_name cho)
# -> (NULL)
find_index_by_name() {
local target=$1
for ((i=0;i<${#names[@]};i++));do
if [[ $target == ${names[i]} ]];then
echo $i
fi
done
}
while read name value;do
if [ -z "$name" ];then
continue
fi
index=$(find_index_by_name "$name")
if [[ -z $index ]];then
names+=($name)
sub_totals+=($value)
else
let sub_totals[index]+=value
fi
done
for ((i=0;i<${#names[@]};i++));do
echo ${names[i]} ${sub_totals[i]}
done
#!/bin/bash
#
# input 파일 형식
# name value
# 공백은 무시
#
# NAME으로 시작하는 변수를 동적으로 생성한다.
# ${!NAME@}은 NAME으로 시작하는 변수의 목록을 리턴한다.
# 주의점
# name은 변수 이름으로 가능한 문자가 와야한다.
# prefix로 사용하는 NAME으로 시작하는 변수가 기존에 존재하지 않아야 한다.
while read name value;do
if [ -z "$name" ];then
continue
fi
keyname=NAME${name}
let ${keyname}+=value
done
for key in ${!NAME@};do
value=${!key}
echo ${key:4} ${value}
done
oh 10
park 10
kang 10
choi 10
oh 20
park 20
kang 20
choi 20
oh 10
park 10
kang 10
choi 10
oh 40
kang 40
choi 40
park 50
kang 50
choi 50
#!/bin/bash
#
# input 파일 형식
# name value
# 공백은 무시
#
# join 명령어는 동일 key에 대한 값을 모아주는 기능을 한다.
# oh 10
# oh 20
# -> oh 10 20
# 인자로 주어지는 2개의 파일은 정렬이 된 상태이어야 한다.
# 한 줄짜리 파일을 기존 결과에 점층적으로 join을 하고 있다.
# 별도의 임시 파일을 만들지 않기 위해서 <( )를 사용했다.
while read line;do
joined=$(join -a1 -a2 <(echo "$line") <(echo "$joined"))
done
while read key values;do
if [[ -z $key ]];then
continue
fi
sum=0
for value in $values;do
let sum+=value
done
echo $key $sum
done <<<"$joined"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment