본문 바로가기

linux

7-3.쉘스크립트_csv생성

728x90
반응형

■7-3. 쉘스크립트_csv생성

파일과 관련된 조건

 

 1.  -d 파일명 : 파일이 디렉토리면 true

2. -e 파일명 : 파일이 존재하면 true

3. -f 파일명 : 파일이 일반 파일이면 true

4. -r 파일명 : 파일이 읽기 가능하면 true

5. -s 파일명 : 파일의 크기가 0 아니면 true

6. -w 파일명: 파일이 쓰기가 가능한 상태면 true

7. -x 파일명: 파일이 실행가능한 상태면 true

 

 

예제:

$ vi f.sh

 

#!/bin/bash

fname=/home/oracle/emp.txt

if [ -e $fname ]; then

    cat $fname

else

    echo 파일이 없습니다

fi

 

 

$ sh f.sh

emp자료가 나옴!

 

 

 

문제164.

위의 스크립트를 수정해서 파일명을 물어보게하고

파일이 존재하면

파일의 내용이 출력되게 하고

없으면

'파일이 없습니다' 라는 메시지가 출력되게 하시오

 

 

[orcl:~]$ sh f.sh

보고싶은 파일명을 입력하세요~dept100.txt

dept100.txt 파일이 없습니다

 

$ vi f.sh

 

#!/bin/bash

echo -n "보고싶은 파일명을 입력하세요~"

read file

fname=/home/oracle/$file

if [ -e $fname ]; then

    cat $fname

else

    echo $file 파일이 없습니다

fi

 

 

 

문제165.

emp.txt 에서 직업이 salesman 사원들의 data 가지고

salesman.txt 라는 파일을 생성하시오

 

[orcl:~]$ grep -i 'salesman' emp.txt >> salesman.txt

 

[orcl:~]$ cat salesman.txt

 7654 MARTIN               SALESMAN                 7698 81/09/10       1250       1400         30

 7499 ALLEN                SALESMAN                 7698 81/02/11       1600        300         30

 7844 TURNER               SALESMAN                 7698 81/08/21       1500          0         30

 7521 WARD                 SALESMAN                 7698 81/02/23       1250        500         30

 

 

 

문제166.

위의 스크립트를 가지고 shell 생성하는데

직업을 물어보게하고 직업을 입력하면

해당 직업의 data 가지고 텍스트 파일이 만들어지게 하시오

 

라이나 생명에서 데이터 분석을 했던 데이터 분석 내용

 

1. 하둡, 오라클, 리눅스 쉘에서 데이터를 필터링을 하고

: 라이나 생명 고객 40대만 따로 분리해서 text 파일을 생성

 

2. 40대의 데이터를 가지고 군집분석(k-means)

 

3. 40대의 데이터를 가지고 연관분석(아프리오리 알고리즘)

: R, 파이썬

 

 

 

$ vi job.sh

 

echo -n "직업을 입력하세요~"

read job

grep -i $job emp.txt >> $job.txt

echo 생성되었습니다~ cat $job.txt 해보세요~

 

[orcl:~]$ cat analyst.txt

 7902 FORD                 ANALYST                  7566 81/12/11       3000          0         20

 7788 SCOTT                ANALYST                  7566 82/12/22       3000          0         20

 

 

 

 

 

문제167.

문제 166 코드를 수정해서 이미 생성된 직업.txt 존재한다면

해당 파일은 이미 있습니다. 라는 메시지가 출력되게 하시오

없으면 생성되게 하시오

 

 

[orcl:~]$ sh job.sh

직업을 입력하세요~analyst

해당 파일은 이미 있습니다~

 

$ vi job.sh

 

echo -n "직업을 입력하세요~"

read job

 

    if [ -e $job.txt ]; then

        echo "해당 파일은 이미 있습니다~"

        break

 

    else

        grep -i $job emp.txt >> $job.txt

        echo 생성되었습니다~ cat $job.txt 해보세요~

    fi

 

 

문제168.

위의 문제처럼 직업을 일일이 물어보지않아도

그냥 알아서 모든 직업에 대한 파일이 아래와 같이 생성되게끔

스크립트를 작성하시오

 

 

[orcl:~]$ sh job.sh

생성되었습니다~ cat ANALYST.txt 해보세요~

생성되었습니다~ cat CLERK.txt 해보세요~

생성되었습니다~ cat MANAGER.txt 해보세요~

생성되었습니다~ cat PRESIDENT.txt 해보세요~

생성되었습니다~ cat SALESMAN.txt 해보세요~

 

 

$vi job.sh

 

if [ -e emp.txt ]; then

job=`awk '{print $3}' emp.txt | sort | uniq`

fi

 

for i in $job

    do

    grep -i $i emp.txt >> $i.txt

 

    echo 생성되었습니다~ cat $i.txt 해보세요~

 

done

~

 

***grep 특정 단어 가져올 쓰는 거고

    awk 해야 컬럼을 가져올 있다.

 

 

 

문제169.

위의 스크립트를 활용해서 부서번호별로 emp.txt 쪼개지게끔

스크립트를 작성하시오

 

$sh make_deptno.sh

$ls -l *.txt

 

$vi make_deptno.sh

 

if [ -e emp.txt ]; then

deptno=`awk '{print $8}' emp.txt | sort | uniq`

fi

 

for i in $deptno

    do

    awk '$8=='$i emp.txt > $i.txt

    echo  $i.txt 가 생성되었습니다~

done

 

 

[orcl:~]$ cat 10.txt

 7839 KING                 PRESIDENT                   0 81/11/17       5000          0         10

 7782 CLARK                MANAGER                  7839 81/05/09       2450          0         10

 7934 MILLER               CLERK                    7782 82/01/11       1300          0         10

 

 

 

 

===============================================

 

데이터 분석을 위해 만들어야할 리눅스 스크립트

1. 데이터를 분리하는 스크립트 ( : salesman.txt)

2. 오라클 --------------> R 또는 파이썬에서 분석할 있도록

text 파일로 생성하는 작업

3. 자동화 스크립트

 

 

 

오라클의 data csv 생성하는 방법

1. 오라클에 접속한다.  sqlplus / as sysdba

show user

 

2. scott 계정과 hr 계정의 lock 해제하고 패스워드를 tiger 변경하시오~

SQL> alter user scott

  2  account unlock;

 

User altered.

 

SQL> alter user scott

  2  identified by tiger;

 

User altered.

 

 

SQL> connect scott/tiger

Connected.

SQL> select * from emp;

emp 자료 좌라락~

 

 

 

 

문제170

직업, 직업별 토탈월급을 출력하는데

직업별 토탈월급이 부터 출력하시오!

 

 

SQL> select job, sum(sal)S

  2  from emp

  3  group by job

  4  order by S desc;

 

JOB                S

--------- ----------

MANAGER         8275

ANALYST         6000

SALESMAN        5600

PRESIDENT       5000

CLERK           4150

 

 

리눅스에서 방향키가 안먹으니, 메모장에 저장하게 해야 한다

명령어가 ed

SQL> ed

Wrote file afiedt.buf

62

근데 에러남. 해결방법 아래 기술

 

 

 

리눅스 sqlplus 에서 ed 쳤을 vi 편집기가 열리게 하는 방법

 

SQL> exit

 

[orcl:~]$ cd $ORACLE_HOME/sqlplus/admin

[orcl:admin]$ pwd

/u01/app/oracle/product/11.2.0/dbhome_1/sqlplus/admin

 

[orcl:admin]$ ls

glogin.sql  help  libsqlplus.def  plustrce.sql  pupbld.sql

 

$ vi glogin.sql

 

아래에

define _editor='vi'

 

 vi 에디터로 정의하겠다 !!

 

$sqlplus scott/tiger

 

 

SQL> select job, sum(sal)

         from emp

         group by job

         order by sum(sal) desc;

SQL> ed

 

 

편집기에서 작성가능한데

세미콜론 쓰면 안되고 슬래쉬 지우면 안됨

(슬래쉬가 세미콜론 역할 !!!)

 

실행시키는 방법:

ed 편집기 열고 저장시키고 나옴

/ 쓰고 엔터

그럼 select 결과 !

 

 

 

리눅스의 emp 테이블을 데이터를 csv 생성하는 방법

 

 

SQL> spool on

SQL>

SQL> spool result.txt

SQL> select *

  2  from dept;

 

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

 

spool off 하고

ed result.txt 하면

내용이 vi 편집기 안에 들어있다.

 

sqlplus 에서 spool 명령어를 이용하면 데이터를 txt csv 파일로 생성할 있다.

 

 

$ vi create_emp_data.sql

 

set colsep ','          #데이터를 , 구분하겠다.

set pagesize 20     # 결과의 세로 사이즈 조절

set linesize 120     # 결과의 가로 사이즈 조절

set sqlprompt ""    # SQL>   <---안나오게 하는 명령어

set feedback off    # " 건이 출력되었습니다." 안나오게 하는 명령어

set echo off         #

set underline off   # 컬럼명 밑에 언더라인이 사라진다

 

spool emp.csv

 

select * from emp;

 

spool off

 

exit

 

편집기에 저장하고,,,,

 

 

SQL> @create_emp_data.sql

 

     EMPNO,ENAME     ,JOB      ,       MGR,HIREDATE ,       SAL,      COMM,    DEPTNO

      7369,SMITH     ,CLERK    ,      7902,17-DEC-80,       800,          ,        20

      7499,ALLEN     ,SALESMAN ,      7698,20-FEB-81,      1600,       300,        30

      7521,WARD      ,SALESMAN ,      7698,22-FEB-81,      1250,       500,        30

      7566,JONES     ,MANAGER  ,      7839,02-APR-81,      2975,          ,        20

      7654,MARTIN    ,SALESMAN ,      7698,28-SEP-81,      1250,      1400,        30

      7698,BLAKE     ,MANAGER  ,      7839,01-MAY-81,      2850,          ,        30

      7782,CLARK     ,MANAGER  ,      7839,09-JUN-81,      2450,          ,        10

      7788,SCOTT     ,ANALYST  ,      7566,19-APR-87,      3000,          ,        20

      7839,KING      ,PRESIDENT,          ,17-NOV-81,      5000,          ,        10

      7844,TURNER    ,SALESMAN ,      7698,08-SEP-81,      1500,         0,        30

      7876,ADAMS     ,CLERK    ,      7788,23-MAY-87,      1100,          ,        20

      7900,JAMES     ,CLERK    ,      7698,03-DEC-81,       950,          ,        30

      7902,FORD      ,ANALYST  ,      7566,03-DEC-81,      3000,          ,        20

      7934,MILLER    ,CLERK    ,      7782,23-JAN-82,      1300,          ,        10

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

 

 

 

[orcl:~]$ cat emp.csv

 

     EMPNO,ENAME     ,JOB      ,       MGR,HIREDATE ,       SAL,      COMM,    DEPTNO

      7369,SMITH     ,CLERK    ,      7902,17-DEC-80,       800,          ,        20

      7499,ALLEN     ,SALESMAN ,      7698,20-FEB-81,      1600,       300,        30

      7521,WARD      ,SALESMAN ,      7698,22-FEB-81,      1250,       500,        30

      7566,JONES     ,MANAGER  ,      7839,02-APR-81,      2975,          ,        20

      7654,MARTIN    ,SALESMAN ,      7698,28-SEP-81,      1250,      1400,        30

      7698,BLAKE     ,MANAGER  ,      7839,01-MAY-81,      2850,          ,        30

      7782,CLARK     ,MANAGER  ,      7839,09-JUN-81,      2450,          ,        10

      7788,SCOTT     ,ANALYST  ,      7566,19-APR-87,      3000,          ,        20

      7839,KING      ,PRESIDENT,          ,17-NOV-81,      5000,          ,        10

      7844,TURNER    ,SALESMAN ,      7698,08-SEP-81,      1500,         0,        30

      7876,ADAMS     ,CLERK    ,      7788,23-MAY-87,      1100,          ,        20

      7900,JAMES     ,CLERK    ,      7698,03-DEC-81,       950,          ,        30

      7902,FORD      ,ANALYST  ,      7566,03-DEC-81,      3000,          ,        20

      7934,MILLER    ,CLERK    ,      7782,23-JAN-82,      1300,          ,        10

 

 

 

 

문제171.

테이블명을 물어보게하고 테이블명을 입력하면

해당 테이블의 데이터를 csv 파일로 생성하는 쉘스크립트를 작성하시오!

 

$ vi make_csv.sh

 

#!/bin/bash

echo "★★★★★★★★★★★★"

echo -n "테이블명을 입력하세요 : "

read table

echo "★★★★★★★★★★★★"

echo " "

sqlplus scott/tiger << EOF        #scott으로 접속해서 아래 EOF(end of file)스크립트 돌려라

set colsep ','

set pagesize 20

set linesize 120

set trimspool on

set sqlprompt ""

set feedback off

set echo off

set underline off

 

spool $table.csv                    # $표시 table.csv

 

select * from $table;

 

spool off

 

EOF

 

 

[orcl:~]$ sh make_csv.sh

★★★★★★★★★★★★

테이블명을 입력하세요 : dept

★★★★★★★★★★★★

 

 

SQL> SQL> SQL> SQL>

    DEPTNO,DNAME         ,LOC

        10,ACCOUNTING    ,NEW YORK

        20,RESEARCH      ,DALLAS

        30,SALES         ,CHICAGO

        40,OPERATIONS    ,BOSTON

 

 

 

[orcl:~]$ cat dept.csv

 

select * from dept;

 

    DEPTNO,DNAME         ,LOC

        10,ACCOUNTING    ,NEW YORK

        20,RESEARCH      ,DALLAS

        30,SALES         ,CHICAGO

        40,OPERATIONS    ,BOSTON

 

spool off

 

 

 

문제172. dept.csv 에서 1번과 2 라인(select부터 아래 공백) 삭제하고

dept2.csv 저장되게 하시오

( 아래 spool off 없애시오)

 

$sed '1,2d' dept.csv > dept2.csv         #d = delete

$sed '/spool/d' dept2.csv > dept3.csv

$ cat dept3.csv

 

   DEPTNO,DNAME         ,LOC

        10,ACCOUNTING    ,NEW YORK

        20,RESEARCH      ,DALLAS

        30,SALES         ,CHICAGO

        40,OPERATIONS    ,BOSTON

 

 

 

문제173.

dept.csv 지우고 dept3.csv dept.csv 이름을 변경하시오

$ rm depe.csv

$ mv dept3.csv dept.csv

 

 

 

 

문제174.

아래의 스크립트를 clean.sh 저장하시오

 

#!/bin/bash

 

sed '1,2d' /home/oracle/$1 > /home/oracle/$12

sed '/spool/d' /home/oracle/$12 > /home/oracle/$13

sed '/^$/d' /home/oracle/$13 > /home/oracle/$14      #공백라인 제거도 넣어줌!

rm /home/oracle/$1

mv /home/oracle/$14 /home/oracle/$1

rm /home/oracle/$12         #emp.csv2 지우려고

rm /home/oracle/$13

 

 

 

문제175.

make_csv.sh 이용해서 emp.csv 생성하시오!

 

$ sh make_csv.sh

쓰고 emp

$ sh clean.sh emp.csv

잡다한게 없어진 emp.csv 있다.

$cat emp.csv

 

 

 

 

문제176.

make_csv.sh clean.sh 스크립트를 수행하는 스크립트를 아래에 입력해서

스크립트를 합치시오 !

 

$ vi make_csv.sh

 

안에

sh /home/oracle/clean.sh $table.csv

추가 !!!!!!  (이게 clean.sh 불러오는 )

 

$ cat salgrade.csv 하면 만들어진 salgrade 있음

 

[orcl:~]$ cat salgrade.csv

     GRADE,     LOSAL,     HISAL

         1,       700,      1200

         2,      1201,      1400

         3,      1401,      2000

         4,      2001,      3000

         5,      3001,      9999

 

 

 

 

문제177.(오늘의 마지막 문제)

hr 계정이 가지고 있는 모든 테이블들을 전부 csv 생성하시오!

 

$sqlplus / as sysdba

 

alter user hr

account unlock;

 

alter user hr

identified by hr;

 

connect hr/hr

 

select table_name from user_tables;

 

 

TABLE_NAME

------------------------------

REGIONS

DEPARTMENTS

COUNTRIES

EMPLOYEES

LOCATIONS

JOB_HISTORY

JOBS

 

7 rows selected.

 

7개의 테이블 전부 csv 생성하시오!

 

***주의사항

오라클에서 set pages,lines 2000 으로 맞추고

 

regions

departments

countries

employees

locations

job_history

jobs

 

728x90
반응형

'linux' 카테고리의 다른 글

8. 유저생성 및 관리  (0) 2019.04.03
7-4.쉘스크립트_case 문  (0) 2019.04.03
7-2.쉘스크립트 while문  (1) 2019.04.03
7-1.쉘스크립트 for문  (0) 2019.04.03
7. 쉘스크립트 작성법  (0) 2019.04.03