Last active
August 7, 2016 15:32
-
-
Save thatseeyou/df2bd7d35e643472291693cdf6efe6ca to your computer and use it in GitHub Desktop.
파일의 각 라인을 분류해서 부분합을 구하는 bash 연습문제. 여러가지 풀이법이 가능하다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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