Q&A

  • [질문]Text file sort방법이요
안녕하세요
델파이 7을 사용하는 초보입니다.
fixed length text file의 특정위치를 기준으로 sort를 하려고 하는데요
방법을 잘 모르겠네요
database를 사용하는게 아니고 결과값도 동일한 text file이어야 합니다.
고수님들의 조언 기다리겠습니다...
3  COMMENTS
  • Profile
    시니 2010.04.16 18:22
    텍스트로된 파일의 행단위 정렬을 할때 사용하는 명령어이다.
    복잡한 워드문서등의 편집이 아닌 간단한 텍스트문서를 대상으로 정렬작업을 할때 주로 사용되는 명령어이다.
    이 명령어는 주로 특정 DB나 프로그램, 또는 쉘프로그램등의 입력값으로 사용되는 데이터를 직접 정렬하려고 할때 사용된다.


    사용형식

    sort [OPTION]... [FILE]...

    사용예 #1

    textfile이라는 파일의 내용은 아래와 같다.

    [root@host3 command]# cat textfile
    4 one nine
    7 eight two
    6 four six
    9 six four
    2 three seven
    3 seven three
    0 five five
    1 nine one
    8 two eight
    5 ten zero
    [root@host3 command]#

    이 데이터를 간단히 정렬하기 위하여 다음과 같이 "sort 파일명"이라고 하였다.

    [root@host3 command]# sort textfile
    0 five five
    1 nine one
    2 three seven
    3 seven three
    4 one nine
    5 ten zero
    6 four six
    7 eight two
    8 two eight
    9 six four
    [root@host3 command]#

    위와 같이 "sort textfile"이라고 하면 textfile의 각 행의 첫번째 단어(필드)들의 첫번째 문자들을 알파벳 오름차순으로 정령을 한다.

    첫번째 문자가 동일할 경우에는 동일한 첫번째 문자를 가진 행끼리 두번째 문자를 가지고 정렬하게 된다.
    두번째 문자가 동일할 경우에는 세번째.........
    이런식으로 비교를 하여 정렬하게 된다.

    아무런 옵션없이 사용하면 위의 예와 같이 화면으로만 출력한다.

    그렇다면 이 결과를 파일로 저장하려면 어떻게 할까?


    사용예 #2

    이번에는 위의 출력되는 결과를 특정 파일에 저장하는 방법을 알아보자.

    [root@host3 command]# sort textfile > textfile_sort
    [root@host3 command]#
    [root@host3 command]# cat textfile_sort
    0 five five
    1 nine one
    2 three seven
    3 seven three
    4 one nine
    5 ten zero
    6 four six
    7 eight two
    8 two eight
    9 six four
    [root@host3 command]#

    위와 동일한 정렬을 하여 textfile_sort라는 파일에 결과를 저장하여 cat으로 결과파일을 확인한 것이다.
    textfile_sort파일이 존재하지 않는다면 새로 만들어서 저장을 하게 된다.
    그리고 textfile_sort파일이 이미 존재하는 파일이라면 기존의 파일내용은 모두 삭제되고 정렬결과만이 저장이 된다.

    사용예 #3

    이번에는 textfile을 내림차순(역순)으로 정렬을 해보자.
    아래와 같이 -r옵션을 사용하면 오름차순이 아닌 내림차순으로 정렬을 해준다.
    이 명령의 결과는 위의 "사용예 #1"과 정반대의 결과임을 알 수있다.

    이 결과 또한 파일에 저장을 하려면 "> 파일명"을 명령어의 끝에 추가하여 실행하면 된다.

    [root@host3 command]# sort -r textfile
    9 six four
    8 two eight
    7 eight two
    6 four six
    5 ten zero
    4 one nine
    3 seven three
    2 three seven
    1 nine one
    0 five five
    [root@host3 command]#

    위의 결과는 textfile의 각 행에 있는 첫번째 문자들을 내림차순(역순)으로 정렬을 한 것이다.

    첫번째 문자가 동일할 경우에는 동일한 첫번째 문자를 가진 행끼리 두번째 문자를 가지고 정렬하게 된다.
    두번째 문자가 동일할 경우에는 세번째.........

    이런식으로 비교를 하여 정렬하게 된다.


    사용예 #4

    지금까지의 예는 모두 각 행의 첫번째 필드를 대상으로 정렬을 하였다.
    그렇다면 첫번째 필드를 무시하고 각 행의 두번째 필드들만을 대상으로 정렬을 할 수는 없을까?

    각 행의 두번째 필드들만을 대상으로 정렬을 하고자한다면 아래와 같이 -k옵션을 사용하면 된다.

    즉, 지금까지의 예들은 모두 각 행의 첫번째 필드인 (각행의 숫자들, 0,1,2,....,9) 숫자를 대상으로 정렬을 하였다.
    -k옵션을 사용하면 각행의 두번재 필드들을 대상으로 정렬을 하게 된다.

    [root@host3 command]# sort -k 2 textfile
    7 eight two
    0 five five
    6 four six
    1 nine one
    3 seven three
    9 six four
    5 ten zero
    2 three seven
    8 two eight
    4 one nine
    [root@host3 command]#

    결과를 보면 각 행의 첫번째 필드는 무시되고 두번째 필드를 기준으로 오름차순 정렬이 된 것을 알 수 있다.


    사용예 #5

    이번에는 각 행의 두번째 필드들을 기준하여 내림차순(역순)정렬을 한 예이다.

    [root@host3 command]# sort -r -k 2 textfile
    4 one nine
    8 two eight
    2 three seven
    5 ten zero
    9 six four
    3 seven three
    1 nine one
    6 four six
    0 five five
    7 eight two
    [root@host3 command]#

    위의 결과를 보면 첫번째 필드인 숫자들과는 무관하게 두번째 필드를 기준으로 내림차순 정렬이 된 것을 확인할 수 있다.


    사용예 #6

    이번에는 3번째 필드를 대상으로 오름차순 정렬을 한 것이다.

    [root@host3 command]# sort -k 3 textfile
    8 two eight
    0 five five
    9 six four
    4 one nine
    1 nine one
    2 three seven
    6 four six
    3 seven three
    7 eight two
    5 ten zero
    [root@host3 command]#

    위의 결과를 보면 각행의 세번째 필드들을 기준으로 정렬이 되었음을 알 수 있다.

    사용예 #7

    이번에는 3번째 필드를 기준으로 내림차순(역순)정렬을 한 예이다.

    [root@host3 command]# sort -r -k 3 textfile
    5 ten zero
    7 eight two
    3 seven three
    6 four six
    2 three seven
    1 nine one
    4 one nine
    9 six four
    0 five five
    8 two eight
    [root@host3 command]#


    사용예 #8

    이번에는 textfile2라는 파일의 내용을 아래와 같이 가정하여 예를 들어 보겠다.
    즉, textfile2라는 파일에는 아래와 같이 동일한 내용의 중복된 내용이 있다.
    중복된 것은 몇개가 되든 하나로 유일하게 취급하여 정렬하고자 한다면 -u옵션을 사용한다.


    다음은 textfile2의 내용이다.

    [root@host3 command]# cat textfile2
    3 three
    3 three
    4 four
    4 four
    1 one
    1 one
    5 five
    5 five
    2 two
    2 two
    [root@host3 command]#

    이것을 아래와같이 일반적으로 정렬을 하면 다음과 같이 오름차순으로 정렬이 될 것이다.

    [root@host3 command]# sort textfile2
    1 one
    1 one
    2 two
    2 two
    3 three
    3 three
    4 four
    4 four
    5 five
    5 five
    [root@host3 command]#

    위의 결과를 보면 동일한 내용이 중복되어 들어가 있는 것을 볼 수가 있다.

    아래는 이런 중복된 행을 하나로 취급하여 유일하게 정렬을 한 것이다.

    [root@host3 command]# sort -u textfile2
    1 one
    2 two
    3 three
    4 four
    5 five
    [root@host3 command]#


    사용예 #9

    이번에는 유일하게 정렬하면서 내림차순(역순)정렬을 함께 한 것이다.
    [root@host3 command]# sort -u -r textfile2
    5 five
    4 four
    3 three
    2 two
    1 one
    [root@host3 command]#

    유일정렬과 역순정렬을 함께한 결과가 위와 같다.



    사용예 #10

    이번에는 두번째 필드를 기준으로 정렬한 예이다.

    [root@host3 command]# sort -k 2 textfile2
    5 five
    5 five
    4 four
    4 four
    1 one
    1 one
    3 three
    3 three
    2 two
    2 two
    [root@host3 command]#

    다음은 두번째 필드를 기준으로 정렬한 다음 유일정렬을 한 예이다.

    [root@host3 command]# sort -u -k 2 textfile2
    5 five
    4 four
    1 one
    3 three
    2 two
    [root@host3 command]#

    이렇게 sort명령어는 다양한 방법으로 응용이 가능하며, 특히 위의 예와 같이 텍스트파일의 중복제거를 하면서 특정 필드를 기준으로 오름차순과 내림차순등으로 정렬하는 것은 리눅스에서 한번 할 수 있는 매우 강력한 방법이 될 수가 있다.


    저작권: 리눅스포털 (www.superuser.co.kr), 무단 재배포및 복사를 금합니다.


    출처 : http://www.superuser.co.kr/superuserboard/view.html?id=34&code=linuxcom&start=50&position=
  • Profile
    이유신 2010.04.17 00:14
    위의 해결책은 리눅스 명령이이네요
    그런데 저의 문제점은 text file에 우선 field라는 개념이 없습니다.
    예를들어 1 record의 길이가 2,000byte이면 900column 부터 906column까지를 기준으로 sort를 하려고 합니다.
    Ultraedit를 사용하기도 하는데 file의 크기가 GB단위일때는 속도도 문제지만 sort가 안되는 경우도 있더군요
    PC의 용량 문제인것도 같구요...
  • Profile
    땅콩맨 2010.04.17 07:12
    아니면
    원하는 Column부분을 Sort할 수 있는 프로그램을 직접 제작하시는것은 어떠세요?
    • 이재욱
    • 2010.04.16 18:03
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 시니
      2010.04.16 18:21
      ... string은 char형들의 나열이라고 생각하시면 됩니다. char str; // str이라는 변수는 1바이트로...
    • 박제홍
      2010.04.16 19:22
      지정된 스트링 길이를 알아내는 법을 질문하신 것이 아니라, 시스템 내에서 사용가능한 스트링의 최대 길...
    • 최유준
      2010.04.16 19:38
      델파이 질문에 왠 C 답변이 올라온거죠?? 답변은 정성스레 올리셨지만..내용은 좀 당황스럽네요.
    • 구창민
      2010.04.16 20:25
      윈도우즈 32비트 버전에서 어플리케이션에게 할당되는 메모리의 크기는 2GB 로 알려져있습니다. 스트...
    • 이재욱
      2010.04.16 21:51
      답변 감사합니다. ^^
    • 폐기처분中
      2010.04.19 08:42
      시니님께서 올려주신 답변은 C에 해당하는 내용인지라 Pascal 을 언어로 쓰는 델파이에는 맞지 않습니다....
    • 신주용
      2010.04.16 18:16
      <!--CodeS--> 아...저도 그런 경험있습니다 전에 하다가 프로젝트 드롭되서 잊고 있었는데... ...
    • 정재현
    • 2010.04.16 17:56
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이유신
    • 2010.04.16 17:34
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 시니
      2010.04.16 18:22
      텍스트로된 파일의 행단위 정렬을 할때 사용하는 명령어이다. 복잡한 워드문서등의 편집이 아닌 간단한...
    • 이유신
      2010.04.17 00:14
      위의 해결책은 리눅스 명령이이네요 그런데 저의 문제점은 text file에 우선 field라는 개념이 없습니다...
    • 땅콩맨
      2010.04.17 07:12
      아니면 원하는 Column부분을 Sort할 수 있는 프로그램을 직접 제작하시는것은 어떠세요?
    • 황재훈
    • 2010.04.16 15:09
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 송재호
      2010.04.16 16:42
      헛.. 저도 정말 필요한 방법인데.. 꼭 아시는 분 있음 답변 주셨으면 좋겟네요~
    • 하기
      2010.04.16 17:47
      RS232C통신을 이용하시면 된다고 하는거 같던데요...
    • 지나가는이
      2010.04.16 21:57
      232통신을 이용하면 read이벤트에서 읽은값이 string으로 넘어오니까. 커서위치하고는 상관이 없고 p...
    • 멋쟁이
      2010.04.16 23:02
      타이머에서 주기적으로 커서를 옮겨주는건 어떤가요?
    • 황재훈
      2010.04.17 02:59
      usb용 핸드스캐너는 그냥 바코드를 읽으면 수치로 표시됩니다 문자나 숫자를 입력할수 있는 곳이면 어디...
    • 델초
      2010.04.17 03:16
      위에 분도 말씀하셨지만 바코드 스케너를 시리얼 통신 방식(RS232C) 의 장비를 사용하셔야 합니다. ...
    • 땅콩맨
      2010.04.17 06:37
      델초님 말씀대로 RS232 방식에서 처리되는 핸드스캐너 프로그래밍방법을 찾아보면서 질문하신 문제가 R...
    • • • •
    • Conan
    • 2010.04.16 10:51
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.04.16 10:32
      폼에 Acrobat ActiveX Control을 올려놓고 unit Unit1; interface uses Windows, Messages, S...
    • 신차돌
    • 2010.04.16 08:51
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2010.04.16 06:50
      프로젝트의 형태를 DLL 로 만드신것 아닌지요? EXE 로 하셔야 그냥 실행 됩니다. 그리고 윈도우 7이신...
    • 김재훈
      2010.04.16 07:25
      저의 경우 윈도우 7에서 델파이7과 2007을 사용중인데 델파이 7은 에러가 간혹 생기곤 하는데 2007은 괜...
    • 윤성철
      2010.04.16 08:03
      두분 답변 감사드립니다. 많은 도움이 되었습니다. ^^
    • 델파이2
    • 2010.04.16 01:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 우용우
      2010.04.16 20:25
      델파이 코딩인지 패스트리포트 코딩인지 정확히 하셔야 하겠지만 일단 패스트리포트 코딩이라고 가정...
    • cos
    • 2010.04.16 07:15
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이길남
      2010.04.16 18:21
      OnDrawColumnCell 이벤트를 사용하시면 될꼬 같습니다. 물론, DefaultDrawing는 False로 해주시고요.
    • 김정원
      2010.04.16 18:51
      DBGrid에서 DrawDataCell 이벤트에 Canvas에서 컬러를 바꾸고 DBGRID.DefaultDrawDataCell() 에서 바꿔주...
    • 임우식
      2010.04.20 03:42
      아 감사합니다.^^ 해결되었습니다.
    • 이민규
    • 2010.04.14 02:48
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2010.04.14 08:21
      Multicast서비스를 하는것 같지 않은데 왜 Server컴포넌트를 쓰시는지요? 단말쪽에서는 IdIPMCastClient...
    • 이민규
      2010.04.14 21:42
      조언 감사합니다. 송신쪽에서는 데이터를 계속 보내는데 수신쪽 수정을 담당한 제가 처리가 늦어 데이...
    • 최용일
      2010.04.15 00:06
      VLC를 이용해서 먼저 테스트해보세요. IGMP버전등을 확인해보시구요. http://www.videolan.org/vlc/down...
    • 이민규
      2010.04.16 19:08
      감사합니다....IdIPMCastClient를 이용하고 네트워크 팀과 이것저것 확인하다보니.. 해결되었습니다.......
    • 얼씨구
    • 2010.04.14 02:07
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.04.14 07:05
      TComport 컴포넌트를 사용해보세요. <!--CodeS--> procedure TF_bs10.ComPort1RxChar(Sender: ...
    • 땅콩맨
      2010.04.14 06:45
      폼의 속성중에서 DoubleBuffered속성을 True로 바꿔보시길~
    • 화담선생
      2010.04.15 01:20
      물론.... 바꾸어 봤습니다.... Form 이건 Panel 이건......
    • 땅콩맨
      2010.04.15 07:06
      WM_ERASEBKGND 메시지나 DoubleBuffered 속성때문인것 같은데 왜 그럴지... 흠...