저는 MATLAB을 비롯하여 다양한 컴퓨터 언어들을 사용하는 것을 좋아하는데 ~ 최근에는 회사에서 실험 데이터를 다루는 과정에서 파이썬을 많이 사용하고 있고 그 중에서 많은 분들이 아실 만한 pandas 라이브러리를 사용하고 있습니다 . 파이썬은 공짜이기도 하지만 pandas 를 비롯한 정말 좋은 라이브러리들이 많아서 앞으로도 꾸준히 사용하게 될 것 같습니다.

실험 데이터들은 많은 경우 엑셀이나 csv 파일 형태로 저장을 하게 되는데, MATLAB에서 xlsread, csvread 와 같은 함수를 통해 이런 데이터들을 불러오게 되고 MATLAB cell 타입에 대해서 다루어야 되는 경우가 종종 있습니다.

셀 타입으로 된 데이터 중 중복되는 내용을 제거하거나~ 유일한 데이터만 추려해야 되는 경우가 종종 발생하게 되는데 오늘은 이에 대해서 소개를 해 보려 합니다.

셀 데이터 중에서 유일한 데이터만 선택하는 것은 정말 간단한데 ~ 아래 포스팅에서도 소개했던 unique() 함수를 사용하시면 되겠습니다.

https://iamaman.tistory.com/269

그리고 위 포스팅에서 사용한 unique, setdiff 함수를 사용하면 ~ 중복되는 내용 역시도 추려 낼 수가 있습니다.

아래와 같이 A 라고 하는 중복되는 내용을 가지고 있는 셀을 준비하고 uniqueDup 함수에 넣어보면~ 유니크한 값이 들어있는 uniqueCell 와 중복된 값이 들어있는 dups 변수를 얻을 수 있습니다.



  1. 오리입니다 2019.11.08 14:07

    매트랩 과제하다가 코드를 잘짠거같은데 움직이질않네요
    한번봐주실수잇아요??
    답을알려드리라는게아니라.. 어떤게잘못됫다라고 짚어주는쪽으로요..가능할까요??
    되신다면. xodls1125-_-@nate.com 메일한번만주세요!!

Windows 에서 파일을 관리 하는 경우 Powershell 을 사용하면 매우 편리합니다. 대부분의 파일 작업은 반복되는 작업인 경우가 많습니다. 이런 작업들을 Powershell 스크립트로 한번 작성 해 놓고 반복해서 사용한다면 매우 편리 할 것입니다.

요즘 많은 분들이 컴퓨터를 사용하여 드라마를 다운로드 받아서 볼 텐데 동일한 드라마에 대한 여러 해상도의 파일을 다운로드 받는 경우가 종종 있습니다. 이런 경우 저는 낮은 해상도의 파일은 지웁니다.

아래는 중복된 파일이 있는 경우의 예입니다. E06 회차의 드라마에 대해 1080p, 720p 의 드라마가 중복되는 것을 확인 할 수 있습니다. 이런 경우 저는 높은 해상도의 파일은 남겨 놓고 낮은 해상도의 파일은 지웁니다.

[tvN] 나의 아저씨.E06.180405.1080p-NEXT.mp4

[tvN] 나의 아저씨.E06.180405.720p-NEXT.mp4

이를 위한 Powershell 스크립트는 아래와 같습니다. 아래 파일에서 ‘드라마폴더경로’ 부분만 본인의 폴더 경로에 맞도록 수정후에 실행하면 될 겁니다.


오늘 포스팅에서는 Linux sort 명령어의 사용 방법에 대해 알아보려 합니다.

 

아래 포스팅에서 텍스트 파일의 내용을 unique 하게 sorting 하는 방법에 대해 설명 드린적이 있는데~

 

아래 포스팅 에서는 Gow의 uniq 명령과 윈도우의 sort명령을 사용했었습니다.


2014/05/14 - [컴퓨터일반] - windows console 에서 텍스트 파일 내용 unique 하게 정렬하기

 

하지만 Linux 의 sort 명령어에는 굉장히 편리하게도 unique 옵션이 있더군요.

 

간단한 예로 다음과 같은 테스트 쿼리를 예로 들어보죠~

 

아래 insert 구문은 아래 포스팅에서 소개 드렸던 generateda를 사용하여 만들어진 테스트 데이터 입니다.


2014/06/17 - [유틸] - Database 테스트 데이터 생성 사이트 generatedata


INSERT INTO myTable (NAME,PHONE,NUMBER) VALUES ("Ahmed","1-156-444-1052",5);

INSERT INTO myTable (NAME,PHONE,NUMBER) VALUES ("Nissim","1-786-558-9774",2);

INSERT INTO myTable (NAME,PHONE,NUMBER) VALUES ("Herman","1-831-439-1058",4);

INSERT INTO myTable (NAME,PHONE,NUMBER) VALUES ("Nissim","1-144-592-7170",1);

INSERT INTO myTable (NAME,PHONE,NUMBER) VALUES ("Gannon","1-863-622-1551",4);

INSERT INTO myTable (NAME,PHONE,NUMBER) VALUES ("Samuel","1-963-369-2263",5);

 

generateda에서 랜덤하게 만들어진 데이터 이므로 중복이 있을수도 있겠죠~ 위에 예로 든 데이터에서는 Nissim 이라는 이름이 중복입니다.

 

위 예처럼 몇 줄 안 되는 경우에는 일일이 확인해서 중복되는 데이터들을 지워 줄 수 있겠지만,중복되는 경우가 많다면 일일이 사람이 지워주기는 힘들겠죠~

 

Linux 의 sort 명령어를 몰랐다면 Excel 과 같은 프로그램등을 이용해서 정렬해서 중복되는 데이터들을 제거 했겠지만 대단히 불편했을 것 같네요~

 

Sort 명령어의 몇 가지 옵션에 대해 알아보겠습니다. 저는 현재 windows 환경이라 Cygwin 에서 linux sort 함수를 사용하도록 하겠습니다.

 

-u : unique 옵션

-t : 뒤에 구분자를 넣어 줌

-k : 뒤에 몇 번째 열을 기준으로 sort 할 것인지를 넣어줌, 쉼표로 구분하여 시작열, 끝열을 넣어줌, 시작열만 지정할 경우 시작열부터 줄의 끝까지임

 

 

 

위 옵션을 바탕으로 위에서 소개한 쿼리 예에 대해 이름에 따른 정렬을 시켜 보죠~ 위 쿼리는 query.txt 파일에 적혀 있습니다.

 

위 쿼리 문자열을 보면 쌍따옴표(") 를 기준으로 2번째 열이 바로 이름 컬럼이라는 것을 알 수있습니다. 따라서 구분자로는 –t 옵션에 쌍따옴표를 넣어주고~ –k 옵션에는 2를 넣어 줍니다. 하지만 그냥 2를 넣어주면 2 부터~ 끝까지 이기 때문에~ 정상적으로 unique 하게 sort 가 안됩니다. 딱 2번째 컬럼 즉 이름 부분만 선택하기 위해 2,2 라고 넣어줘야 합니다.

 

sort –u –k 2,2 –t '"' query.txt > uniq.txt

 

 

위 명령을 실행해 보겠습니다. 다음과 같이 중복된 이름이었던 4번째 행이 사라진 것을 확인 할 수 있습니다.

 

아래 포스팅에서 파이썬을 이용하여 텍스트 파일의 내용을 unique 하게 sorting 하는 방법에 대해 소개한 적이 있는데요~ 



2013/11/26 - [programming language/Python] - ipython으로 unique 하게 sorting 하기

 


좀더 찾아보니 리눅스 명령어들을 사용하면 훨씬 더 쉽게 할 수 있더군요.

 

리눅스를 사용하시는 분들이라면 그냥 사용하면 되겠지만 윈도우를 사용하시는 분들은 아래 포스팅에서 소개해 드렸던 GNU On Windows (GOW) 를 설치 하시기 바랍니다.



2012/11/11 - [유틸] - GNU On Windows 를 이용하여 Windows 에서 Linux 명령어 사용하기

 

아님~ 윈도우에 Cygwin 을 설치해서 사용하시는 분들이라면 그냥 Cygwin terminal 상에서 하셔도 무방 합니다.

 

unique 한 정렬을 위해 사용하는 명령어는 uniq 인데요~

 

다음과 같은 sampleFile.txt 파일이 있을 때~

 

위에 보이는 바와 같이 sample1 이 3개 sample3 가 2 개가 있고 나머지는 1개씩 있습니다.

 

uniq 명령어는 연달아서 중복된 내용이 있을 때만 중복된 내용을 제거 해 줍니다. 따라서 텍스트 파일의 내용을 unique 하게 정렬하기 위해서는 다음과 같이 sort 를 먼저 한 다음에 uniq 명령어를 통해 중복된 내용들을 제거 해 줄 수 있습니다.

 

uniq 명령어에는 다음과 같은 다양한 옵션들이 있는데~ 제가 사용하는 옵션들은 다음과 같습니다.

 

–c : 개수를 센다.

 

-d : 중복되는 라인만 나오게 한다.

 

-u : unique 한 라인만 나오게 한다.



특정 파일에 다음과 같은 단어 리스트가 있는 경우 중복을 제거하고~ ABC 순서로 sorting 을 해야 하는 경우가 있습니다.

 

abacuses

abaft

abalone

abalones

abacuses

abandon

abandoned

abalones

 

한 10줄 안팎이면 노가다로 하겠지만 몇 천 몇 만 줄이 되면 노가다로 하기에는 무리가 있죠~

 

이런 경우 Perl이나 Python과 같은 스크립트 언어가 제격일 텐데요~

 

오늘은 그냥 무슨 바람이 불어서 그런지 그냥 python을 사용하고 싶더군요.

 

아래 포스팅에서 소개를 했지만 제가 요즘 Spyder 같은 툴에 매력을 느껴서 그런 것도 같습니다.


2013/11/13 - [유틸] - 과학 분석에 사용되는 Python IDE Spyder

 

어쨌든 ipython을 사용하는 방법을 검색 해보니 아래 주소에 간단하게 나오더군요.


http://stackoverflow.com/questions/2931672/what-is-the-cleanest-way-to-do-a-sort-plus-uniq-on-a-python-list

 

다음과 같이 간단하게 Unique Sorting 을 할 수 있었습니다. Set Type으로 만드니깐 간단하게 중복된 내용들이 제거되더군요.

 

fo=open("input.txt","r")

line=fo.readlines()

my_list= sorted(set(line))

fo.close()

 

fo=open("result.txt","w")

fo.writelines(my_list)

fo.close()

 

이런 게 스크립트의 매력인가 봅니다.


오늘은 MATLAB의 집합 관련 함수들에 대해 알아보겠습니다.

 

다음과 같은 벡터 A,B 에 대하여 교집합은 intersect()라는 함수를 이용합니다. 

 

합집합은 union() 함수를 이용합니다. 

 

차집합은 setdiff() 함수를 이용합니다. 

 

위 결과에서 A-B 를 하므로 교집합 [1 2] 를 제외하고 [3 4 5 6] 이 출력되게 됩니다.

 

벡터 내의 유일한 원소에 대해 찾고 싶을 때는 unique() 함수를 이용합니다. 

 

위 예에서 1, 2, 3 은 중복이 되 있으므로, 한번씩만 나타내게 되는 겁니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18
MATLAB 집합 관련 함수들  (0) 2011.06.13
MATLAB plot tools  (0) 2011.05.26
MATLAB Graphic handle  (0) 2011.05.25
MATLAB adaptive filtering, Least Mean Square(LMS)  (4) 2011.05.23
MATLAB Dependency Report  (0) 2011.05.21

+ Recent posts