본문 바로가기

linux

7-1.쉘스크립트 for문

728x90
반응형

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

 

 

 

728x90
반응형

'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