awk, sed 질문

kokori0116의 이미지

awk 와 sed 를 이용해서 쉘 프로그램 작성 중입니다.

며칠 동안 해결하지 못해 여기에 글을 올립니다.

# cat 1.txt
홍길동 1 1 10 10 10
김철수 2 2 20 20 20
김말자 3 3
김영희 4 4 40 40 40
오영심 5 5 50 50 50

#cat 2.txt
이름 = A
학년 = B
반 = C
국어 = D
영어 = E
수학 = F

파일 1.txt에 있는 값을 2.txt 에 대입시켜 result라는 결과를 만들었습니다.

# cat result
이름 = 홍길동
학년 = 1
반 = 1
국어 = 10
영어 = 10
수학 = 10

이름 = 김철수
학년 = 2
반 = 2
국어 = 20
영어 = 20
수학 = 20

이름 = 김말자
학년 = 3
반 = 3
국어 = 40
영어 = 40
수학 = 40

이름 = 김영희
학년 = 4
반 = 4
국어 = 50
영어 = 50
수학 = 50

이름 = 오영심
학년 = 5
반 = 5
국어 =
영어 =
수학 =

질문. 김말자 학생은 점수가 없어 입력하지 않았는데 결과 파일(result)에서는 다음 줄 학생(김영희)의 점수가 들어가고 있어요. 빈 값을 뒤 줄에서 하나씩 채우고 있는것 같은데 .. 해결책을 모르겠네요

쉘은 다음과 같습니다.

#!/bin/bash
 
AA=`awk 'BEGIN{FS="\t"};{print $1}' 1.txt`
BB=`awk 'BEGIN{FS="\t"};{print $2}' 1.txt`
CC=`awk 'BEGIN{FS="\t"};{print $3}' 1.txt`
DD=`awk 'BEGIN{FS="\t"};{print $4}' 1.txt`
EE=`awk 'BEGIN{FS="\t"};{print $5}' 1.txt`
FF=`awk 'BEGIN{FS="\t"};{print $6}' 1.txt`
 
AT=($AA)
BT=($BB)
CT=($CC)
DT=($DD)
ET=($EE)
FT=($FF)
 
NUM=`cat 1.txt | wc -l`
FileNum=`expr $NUM - 1`
count=0
 
while true
do
if [ ${count} -gt $FileNum ]
then
        exit
fi
 
sed -n s/A/${AT[${count}]}/p 2.txt >> result
sed -n s/B/${BT[${count}]}/p 2.txt >> result
sed -n s/C/${CT[${count}]}/p 2.txt >> result
sed -n s/D/${DT[${count}]}/p 2.txt >> result
sed -n s/E/${ET[${count}]}/p 2.txt >> result
sed -n s/F/${FT[${count}]}/p 2.txt >> result
echo " " >> result
 
count=`expr ${count} + 1`
 
done

eseo의 이미지

꼭 awk & sed 를 사용해야만 하는게 아니라면, 다음과 같이 하는 수도 있습니다.

#!/bin/sh
for file in 1.txt 2.txt
do
    while read name grade class kor eng mat
    do
cat >> result << EOF
이름 = $name
학년 = $grade
반 = $class
국어 = $kor
영어 = $eng
수학 = $mat
 
EOF
    done < $file
done

---
배려하는 마음을 갖자.

kokori0116의 이미지

eseo 님에 따라 아래와 같이 해봤는데요..

아래와 같이(홍길동과 김철수) 중간에 빈 값이 들어가면 뒤에 있는 값이 하나씩 앞으로 밀리더라구요
김말자의 경우에는 뒤에도 빈값이 있어서 앞으로 밀려도 빈값이라 정상이구요..

# cat 1.txt
홍길동 1 1 10 (빈값) 10
김철수 2 2 (빈값) 20 20
김말자 3 3 (빈값) (빈값) (빈값)
김영희 4 4 40 40 40
오영심 5 5 50 50 50

( 값과 값 사이의 구분은 탭이예요!! )

#!/bin/sh
for file in 1.txt
do
OIFS=$IFS; IFS=$'\t'
    while read name grade class kor eng mat
    do
cat >> result << EOF
이름 = ${name};
학년 = ${grade};
반 = ${class};
국어 = ${kor};
영어 = ${eng};
수학 = ${mat};
 
EOF
    done < $file
IFS=$OIFS
done
madman93의 이미지

a.txt ?? 는 뭔가요?

---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

kokori0116의 이미지

a.txt 가 아니라 1.txt 입니다

geoplab의 이미지

아래와 같이 하면 1.txt 화일 안의 각 라인 상에서 column 의 갯수 (na)를 확인하실 수 있을겁니다.
#!/bin/csh -f
set i = 0
while ($i < $n)
@ i++
set a = `head -$i 1.txt | tail -1`
set na = `echo $a | wc -w`
end

그리고 na값에 따라 다르게 기록하면 되지않을까요?

eseo의 이미지

만일 모든 구분자가 tab 이라면, 이렇게 해도 되겠네요.

awk -F "\t" '{printf("이름 = %s\n학년 = %s\n반 = %s\n국어 = %s\n영어 = %s\n수학 = %s\n\n", $1, $2, $3, $4, $5, $6)}' 1.txt                                                                                                     

---
배려하는 마음을 갖자.

익명 사용자의 이미지

혹시,, 이름마다 점수 결과 파일을 만들고 싶을 땐 어떻게 해야 되나요? 예를 들어 (이름이 한글이므로..) 홍길동을 AAA라고 했을 때 AAA.txt 라고 만드려면...

각 이름마다 파일이 만들어지기는 하는데 아무리해도 AAA.txt 파일에 AAA 학생을 포함한 모든 학생의 점수가 기록이 되네요.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.