유닉스 소스 구현 좀,,

kokoeo25의 이미지

유닉스 좀 여쭤봐도 될까요?

data1.txt 파일 안에요,,

4518430093208268S1030441201004
4518426837844004F9270441201409
3562912094860004F570121A201101

이렇게 나열된 숫자가 예를 들어 100개라면 한 줄씩 읽습니다.
한 줄씩 읽고나서 data2.txt. 파일에 아래와 같이 저장하고 싶어요

numarray[0] 4518430093208268 >> 16자리
numarray[1] S103 >> 4자리
numarray[2] 04 >> 2자리
numarray[3] 4 >> 1자리
numarray[4] 1 >> 1자리
numarray[5] 6 >> 1자리

numarray[2] 가 2자리 이면 04 > 004로 0을 추가하구요

numarray[3]은 0~9 또는 A~G 중에 하나가 입력되면 앞에 숫자 1이 추가 되고

numarray[4] 는 아래와 같이

입력값 출력값
1 111
4 121
2 122
7 123
5 131
3 132
6 140
9 160

출력값이 나오게 하고 싶은데요,,

data2.txt에는
"UPDATE CDH SET SCDHBANKCDE=' " + numArray[2]+ " '
, SCDHBILLCLASSCDE = ' " + numArray[3] + " '
, SCDHBILLPLACECDE=' "+ numArray[4] +" '
WHERE SCDHACCTKEY='"+numArray[0]+"';"

이렇게 값을 받아오게 하고 싶은데 조금만 알려주시면 안될까요?

kokoeo25의 이미지

numarray[5] 6 >> 1자리 ==> numarray[5] 201004 >> 6자리 입니다..ㅠ

snowall의 이미지

C언어라면
파일 열고 읽어오는건 fopen, fscanf를 이용하면 될 거고요
자릿수가 정해져 있으므로 그냥 문자열을 배열로 간주해서 중간에 끊고, atoi로 형변환해주면 되겠죠. strstr을 써도 될 것 같군요
numarray[2]에서 0을 추가하는건 strcat으로 합친 후에 형변환하면 되겠고요
numarray[3]이랑 numarray[4]를 처리하는건 직접 고민해 보세요
data2.txt에 출력할때는 fprintf를 쓰면 될건데, 그 전에 strcat으로 잘 합쳐서 내보내야겠죠

질문에 언어가 특정되어 있지 않아서 매우 대답하기 어려웠습니다. 유닉스에서 쓸 수 있는 언어가 한두가지여야 말이죠...

bash, perl, python, C++, Fortran 등등...

피할 수 있을때 즐겨라! http://melotopia.net/b

kokoeo25의 이미지

아,,죄송해여... 유닉스 bash였습니다.ㅠㅠ

qiiiiiiiip의 이미지

#!/bin/bash
cat data1.txt | while read l ; do
    a=${l:0:10}
    b=${l:10:2}
    printf 'A=%s B=%03d\n' $a $b
done > data2.txt

대략 이정도 코드를 기본으로 직접 고민해보시길..

bushi의 이미지

numarray[3] 과 numarray[4] 에 대한 설명이 바뀐 것 같지만,
아무튼 csh 로 작성된 소스를 이미 누군가로부터 얻으신 것 같으니, bash 도.

#!/bin/bash
 
val_4_default="000"
 
#                           0    1   2   3   4   5   6   7                8   9
conv_4_table=(${val_4_default} 111 122 132 121 131 140 123 ${val_4_default} 160)
 
conv_4()
{
        local v="${1}"
        local r="${conv_4_table[${v}]}"
        [ -z "${r}" ] && echo "${val_4_default}"
        echo "${r}"
}
 
conv_3()
{
        local v="${1}"
        local c="${v:0:1}"
        case "${c}" in
        [0-9,A-G])
                printf "1%s" ${v}
        ;;
        *)
                printf "%s" ${v}
        ;;
        esac
}
 
while read LL;
do
        L=`echo $LL`
        A=(${L:0:16} ${L:16:4} ${L:20:2} ${L:22:1} ${L:23:1} ${L:24:6})
        printf "UPDATE CDH SET SCDHBANKCDE=' %03d ', SCDHBILLCLASSCDE = ' %s ' ', SCDHBILLPLACECDE=' %s ' WHERE SCDHACCTKEY='%s';\n" \
             ${A[2]} `conv_3 ${A[3]}` `conv_4 ${A[4]}` ${A[0]}
done

[bushi@rose net]$ cat data1.txt
4518430093208268S1030441201004
4518426837844004F9270441201409
3562912094860004F570121A201101
[bushi@rose net]$ rm data2.txt
[bushi@rose net]$ sh x.sh < data1.txt > data2.txt
[bushi@rose net]$ cat data2.txt
UPDATE CDH SET SCDHBANKCDE=' 004 ', SCDHBILLCLASSCDE = ' 14 ' ', SCDHBILLPLACECDE=' 111 ' WHERE SCDHACCTKEY='4518430093208268';
UPDATE CDH SET SCDHBANKCDE=' 004 ', SCDHBILLCLASSCDE = ' 14 ' ', SCDHBILLPLACECDE=' 111 ' WHERE SCDHACCTKEY='4518426837844004';
UPDATE CDH SET SCDHBANKCDE=' 012 ', SCDHBILLCLASSCDE = ' 11 ' ', SCDHBILLPLACECDE=' 000 ' WHERE SCDHACCTKEY='3562912094860004';
[bushi@rose net]$
kokoeo25의 이미지

감사합니다.. 그런데요 conv_3()에서요 7만 예외로 31 숫자가 입력이 되려면 어떻게 하는지와 공백이 입력되면 공백이 출력이 되게 가능한가요?

bushi의 이미지

아무거나 주력으로 삼을 스크립트 언어를 정해서 매뉴얼 보고 필요할 때 마다 하나씩 해결하며 공부하시는 것도 나쁘진 않습니다.

#!/bin/bash
 
val_4_default="000"
 
#                           0    1   2   3   4   5   6   7                8   9
conv_4_table=(${val_4_default} 111 122 132 121 131 140 123 ${val_4_default} 160)
 
conv_4()
{
        local v="${1}"
        local r="${conv_4_table[${v}]}"
        [ -z "${r}" ] && echo "${val_4_default}"
        echo "${r}"
}
 
conv_3()
{
        local v="${1}"
        local c="${v:0:1}"
        case "${c}" in
        " ")
                echo -n " "
        ;;
        "7")
                echo -n "31"
        ;;
        [0-9,A-G])
                echo -n "1${v}"
        ;;
        *)
                echo -n "${v}"
        ;;
        esac
}
 
while read LL;
do
        L=`echo $LL`
        OLD_IFS=${IFS}
        IFS=
        A=(${L:0:16} ${L:16:4} ${L:20:2} "${L:22:1}" ${L:23:1} ${L:24:6})
        printf "UPDATE CDH SET SCDHBANKCDE='%03d'" "${A[2]}"
        echo -n ", SCDHBILLCLASSCDE='`conv_3 ${A[3]}`'"
        echo -n ", SCDHBILLPLACECDE='`conv_4 ${A[4]}`'"
        echo    ", WHERE SCDHACCTKEY='${A[0]}';"
        IFS=${OLD_IFS}
done

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.