awk, sed 질문
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
awk & sed
꼭 awk & sed 를 사용해야만 하는게 아니라면, 다음과 같이 하는 수도 있습니다.
---
배려하는 마음을 갖자.
추가 질문이에요^^
eseo 님에 따라 아래와 같이 해봤는데요..
아래와 같이(홍길동과 김철수) 중간에 빈 값이 들어가면 뒤에 있는 값이 하나씩 앞으로 밀리더라구요
김말자의 경우에는 뒤에도 빈값이 있어서 앞으로 밀려도 빈값이라 정상이구요..
# cat 1.txt
홍길동 1 1 10 (빈값) 10
김철수 2 2 (빈값) 20 20
김말자 3 3 (빈값) (빈값) (빈값)
김영희 4 4 40 40 40
오영심 5 5 50 50 50
( 값과 값 사이의 구분은 탭이예요!! )
a.txt ?? 는 뭔가요?
a.txt ?? 는 뭔가요?
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------
오타예요^^*
a.txt 가 아니라 1.txt 입니다
아래와 같이 하면 1.txt 화일 안의 각 라인
아래와 같이 하면 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값에 따라 다르게 기록하면 되지않을까요?
awk
만일 모든 구분자가 tab 이라면, 이렇게 해도 되겠네요.
---
배려하는 마음을 갖자.
혹시,, 이름마다 점수 결과 파일을 만들고 싶을 땐
혹시,, 이름마다 점수 결과 파일을 만들고 싶을 땐 어떻게 해야 되나요? 예를 들어 (이름이 한글이므로..) 홍길동을 AAA라고 했을 때 AAA.txt 라고 만드려면...
각 이름마다 파일이 만들어지기는 하는데 아무리해도 AAA.txt 파일에 AAA 학생을 포함한 모든 학생의 점수가 기록이 되네요.
댓글 달기