■7-1. 쉘스크립트 for문
문제141.
emp.txt. 를 for loop 문을 이용해서 emp1.txt ~ emp100.txt 로 복사하시오
답:
[orcl:~]$ for i in {1..100}
> do
> cp emp.txt emp$i.txt
> done
문제142. 짝꿍하고 자리를 바꿔서 emp1.txt~emp100.txt 중
하나 또는 여러개의 파일을 랜덤으로 골라서
데이터를 변경하고 자리로 돌아오시오
변경하고
$clear (명령어 지우는 기능)
짝꿍이 무엇을 바꿨는지 한번에 알아내는 방법!
■ 짝꿍이 100개의 파일중에 무엇을 변경했는지 한번에 알아내는 방법
문제143.
emp3.txt 를 열어서 3000을 3900으로 변경하시오
:%s/3000/3900/g
저장하고 빠져나오시옹
문제144.
emp.txt. 와 emp3.txt 파일 둘 간의 데이터의 차이가 있는지
확인하시오
$ diff emp.txt emp3.txt
[orcl:~]$ diff emp.txt emp3.txt
10c10
< 7902 FORD ANALYST 7566 81/12/11 3000 0 20
---
> 7902 FORD ANALYST 7566 81/12/11 3900 0 20
12c12
< 7788 SCOTT ANALYST 7566 82/12/22 3000 0 20
---
> 7788 SCOTT ANALYST 7566 82/12/22 3900 0 20
$ diff --brief emp.txt emp3.txt
[orcl:~]$ diff --brief emp.txt emp3.txt
Files emp.txt and emp3.txt differ
문제145.
짝꿍이 emp1.txt ~emp100.txt 중 어떠한것을 변경했는지
한 번에 알아내시오
[orcl:~]$ for i in {1..100}
> do
> diff --brief emp.txt emp$i.txt
> done
Files emp.txt and emp2.txt differ
Files emp.txt and emp3.txt differ
Files emp.txt and emp31.txt differ
다른방법!!
for ((i=1; i<=100; i++))
do
diff --brief emp.txt emp$i.txt
done
■ sed 명령어로 공백라인을 지우는 방법 (데이터 정제 작업)
1. emp.txt 를 열어서 중간에 공백라인을 하나 넣으시오
2. emp.txt 안에 공백 라인이 있는지 검색한다
$sed -n /^ $/p emp.txt | wc -l
3. emp.txt 안에 공백라인을 삭제한다
$ sed '/^ $/d' emp.txt >> emp_backup.txt **공백삭제하고 백업에 복사해라
$ rm empt.xt **emp 지워라
$mv emp_backup.txt emp.txt **백업내용을 emp에 덮어써라(백업은 비어버림)
$ sed -n '/^ $/p' emp.txt | wc -l **공백있나 검색해라
※ 설명:
-n 옵션은 sed 옆의 식에 해당하는 데이터만 출력해라 라는 뜻이다.
※ 엔터로 넣은 공백까지 다 지우는 방법
1. emp.txt 를 열어서 중간에 공백을 넣는데 여러번 엔터를 쳐서 넣으시오
2. emp.txt 에서 여러번 엔터를 넣은 공백이 있는지 확인한다
cat emp.txt
3. emp.txt 에서 여러번의 엔터를 넣은 공백을 지운상태로 출력하시오
$sed '/^ *$/d' emp.txt (삭제할 때 싱글쿼테이션 쓴다)
4. $sed '/^ $/d' emp.txt >> emp_backup.txt
5.
$rm emp.txt
$mv emp_backup.txt emp.txt
문제146. 짝꿍과 자리를 바꿔서 emp1.txt~emp100.txt 중
몇 개를 열어서 공백을 막 넣어주고 자리로 돌아오시오~
(위의 sed 명령어와 if 문을 조합하시오)
결과가 공백 넣은 파일명이 출력되어야 함
문제147. 짝꿍이 바꾼 파일을 찾아내시오
[orcl:~]$ for i in {1..100}
> do
> a=`sed -n '/^ *$/p' emp$i.txt | wc -l`
> if [ $a -ne 0 ]; then
> echo emp$i
> fi
> done
emp5
emp79
emp86
sh aa.sh 로 확인
※ 설명
> if [ $a -ne 0 ]; then
"a가 0 이 아니면" ==즉 공백값이 1이상 출력되면!
문제148.(점심시간 문제)
짝꿍이 공백을 입력한 파일들의 공백을 다 지우시오
(손으로 하지 말고 쉘로 지우시오)
sh sed_del.sh
[orcl:~]$
for i in {1..100}
do
a=`sed -n '/^ *$/p' emp$i.txt | wc -l`
if [ $a -ne 0 ]; then
b=`sed -n '/^ *$/d' $a`
echo "지웠습니다~"
fi
done
**b 라는 변수 만들 필요도 없네
문제149.(BC 카드 공채 문제)
아래의 쉘을 구현하시오!
$sh factorial.sh 5
120
$ vi factoral.sh
res=1
for i in `eval echo {1..$1}`
do
res=`expr $res \* $i`
done
echo $res
문제150(알고리즘 문제)
아래의 power 함수를 쉘로 구현하시오!
SQL> select power(2,3)
from dual;
8
$ sh power.sh 2 3
8
res=1
for i in `eval echo {1..$2}
do
res=`expr $res \* $i`
done
echo $res
위에꺼 답 안될텐데??
아래 다시 푼거(집컴이라 못 돌려봄)
x=1
for i in `eval echo {1..$2}
do
x=`expr$1 \* $x`
done
echo $x
문제151.(알고리즘 문제)
$sh maxyaksu.sh 16 24
8
$expr 24 % 16
8 <------나눈 나머지 값
$expr 24%8
0 <-----나눈 나머지 값
--------------------------
[orcl:~]$ vi maxyaksu.sh
for i in `eval echo {1..$2}`
do
a=`expr $1 % $i`
b=`expr $2 % $i`
if [ $a -eq 0 ] && [ $b -eq 0 ]; then
val=$i
fi
done
echo $val
-------------------------
[orcl:~]$ sh -x maxyaksu2.sh 24 16
+ a=24
+ b=16
+ for i in '{1..100}'
++ expr 24 % 16
+ c=8
+ '[' 8 -eq 0 ']'
+ a=16
+ b=8
+ for i in '{1..100}'
++ expr 16 % 8
+ c=0
+ '[' 0 -eq 0 ']'
+ val=8
+ break
+ echo 8
8
-----------------------------------------------
문제152.
직업을 중복제거 해서 출력하시오!
[orcl:~]$ awk '{print $3}' emp.txt | sort | uniq
ANALYST
CLERK
PRESIDENT
jjj
문제153.
위의 결과를 변수에 담아서 for loop 문으로 변수의 내용을 출력하시오
vi a.sh
job=`awk '{print $3} emp.txt|sort|uniq`
for i in $job
do
echo $i
done
[orcl:~]$ sh a.sh
ANALYST
CLERK
PRESIDENT
jjj
문제154.
직업이 SALESMAN 인 사원들의 토탈월급을 출력하시오
[orcl:~]$ grep -i 'SALESMAN' emp.txt | awk '{sum=sum+$6} END {print sum}'
5600
문제155.
문제 153번 코드와 문제 154번 코드를 조합해서
아래의 결과를 출력하시오
[orcl:~]$ sh a.sh
ANALYST 6000
CLERK 4150
MANAGER 8275
PRESIDENT 5000
SALESMAN 5600
$ vi a.sh
job=`awk '{print $3}' emp.txt|sort|uniq`
for i in $job
do
aaa=`grep -i $i emp.txt | awk '{sum=sum+$6}END{print sum}'`
echo $i, $aaa
done
--------------------------------------
또는
job=`awk '{print $3}' emp.txt|sort|uniq`
for i in $job
do
aaa=`grep -i $i emp.txt | awk '{sum=sum+$6}END{print $3,sum}'`
echo $aaa
done
문제156. (이런식으로 NCS 시험 내겠다고 하셨음)
(마지막 문제)
부서번호, 부서번호별 평균월급을 출력하시오
[orcl:~]$ sh a.sh
10, 2916
20, 2175
30, 1566
vi a.sh
deptno=`awk '{print $8}' emp.txt|sort|uniq`
for i in $deptno
do
aaa=`awk '$8=='$i'{sum=sum+$6}END{print sum}' emp.txt`
count=`awk '$8=='$i'{print $1}' emp.txt | wc -l`
bbb=`expr $aaa / $count`
echo $i, $bbb
done
'linux' 카테고리의 다른 글
7-3.쉘스크립트_csv생성 (0) | 2019.04.03 |
---|---|
7-2.쉘스크립트 while문 (1) | 2019.04.03 |
7. 쉘스크립트 작성법 (0) | 2019.04.03 |
6. 프로세서 관리 (0) | 2019.04.03 |
디스크 관리[df,du,sar,한글 input, 리눅스 str] (0) | 2019.01.02 |