[완료] 열의 데이타에서 중복된 내용만 제거 하기 ?
글쓴이: 서지훈 / 작성시간: 금, 2008/03/28 - 3:45오후
지금 처리해야할 데이타 형식은 아래와 같습니다.
field1,value1,value2,value3 field2,value1,value2,value3 field3,value1,value2,value3 ...
이런 구조의 데이타에서 value1, value2, value3중에서 중복된 값이 있을 경우 이 값을 제거 하고 싶습니다.
여기에 대한 좋은 아이디어 있으면 추천 받습니다.
외부 command든 구현 알고리즘이든 모든것 환영합니다.
야근 없는 주말을 위해 ~~~
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
Forums:


필드 구분이
필드 구분이 witespace이면 아주 간단합니다.
첫 필드의 자릿수가 고정이라면,
연속된 라인만 중복 제거를 하므로 sort를 이용해 적절히 정렬 후 사용하시면 될듯...
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
문제가 잘 이해가
문제가 잘 이해가 안되네요 -_-;;; 예제를 적어주세요
예를 들어 데이터가
field1,2,1,1
field2,3,2,4
field3,2,1,1
라면 어떤 결과가 나와야하나요?
field1,2,1 field2,3,2,4 field
field1,2,1
field2,3,2,4
field3,2,1
결과는 이와 같이 field1과 field3에서 중복되는 값을 제거 해야 합니다.
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
field1,9,9,9
field1,9,9,9
field2,2,1,2
field3,8,8,9
field1,9
field2,2,1
field3,8,9
이렇게 되는 것인가요?
네... 근데... value값은
네...
근데... value값은 같은 행에선 순서에 구애를 받지 아니하구요 ㅎㅎ;
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
Perl 코드입니다.
데이터
코드 1
#!/usr/bin/perl use strict; use warnings; open my $fh, '<', $ARGV[0]; while(<$fh>) { chomp $_; my @array = split /,/, $_; my %seen = (); my @uniq = grep { ! $seen{$_}++ } @array[1 .. $#array]; print join( ',', ($array[0],@uniq) ),"\n"; }List::MoreUtils 모듈의 uniq함수를 사용한 버젼
#!/usr/bin/perl use strict; use warnings; use List::MoreUtils qw(uniq); open my $fh, '<', $ARGV[0]; while(<$fh>) { chomp $_; my @array = split /,/, $_; print join( ',', ($array[0], uniq(@array[1 .. $#array]) ) ) ,"\n"; }perl code.pl data.txt 결과
오... 굿 ~~~ -_-b 바로
오... 굿 ~~~ -_-b
바로 해결 되네요.
근데... 이게 오버헤드가 많이 걸리는 안되는 작업인데...
포퍼먼스 괜찮겠죠 ? ㅎㅎ;
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
perl을 이용한 다른
perl을 이용한 다른 방법입니다. 속도는 느릴테지만, 그냥 재미로
http://codepad.org/1HNv5TwE
#!/usr/bin/perl use strict; my @data=qw{ field1,2,1,1,1,2,2,3,1,1,1,5,3 field2,3,2,4 field3,2,1,1 }; my @new=@data; #느리지만 재밌는 방법 #perl -nle'1while s/((,[^,]+?).*?)\2/$1/g;print' data.txt 와 동일 map{ 1while s/((,[^,]+?).*?)\2/$1/g;print $_,"\n" } @new; @new=@data; #일반적인 방법(aero님의 것과 같음) #perl -nle'my%h;$f,@v)=split",",$_;print join",",$f,grep{!$h{$_}++;}@v' data.txt 와 동일 map{ my%h;my($f,@v)=split",",$_;print join",",$f,grep{!$h{$_}++;}@v; print"\n" } @new; #순서가 상관없고, field1, field2등이 없을때 간단한 방법. map { my%h;@h{split/,/,$_}++;print join(',',keys%h),"\n" } @data;댓글 달기