■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
'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 |