쉘스크립트로 txt 내용 바꾸기 - vi 편집기
1,0777770001001,101,101,0,2,16,1,1,1530,POWER,5502
2,0777770001001,101,102,2,2,16,1,1,1530,POWER,5502
3,0777770001001,101,103,4,2,16,1,1,1530,POWER,5502
4,0777770001001,101,104,6,2,16,1,1,1530,POWER,5502
5,0777770001001,101,105,8,2,16,1,1,1530,POWER,5502
1,0777770001001,112,101,0,2,16,1,1,9999,MAP,5502
2,0777770001001,112,102,2,2,16,1,1,9999,MAP,5502
3,0777770001001,112,103,4,2,16,1,1,9999,MAP,5502
4,0777770001001,112,104,6,2,16,1,1,9999,MAP,5502
5,0777770001001,112,105,8,2,16,1,1,9999,MAP,5502
1,0777770001002,102,101,0,2,16,1,1,1530,POWER,5502
2,0777770001002,102,102,2,2,16,1,1,1530,POWER,5502
3,0777770001002,102,103,4,2,16,1,1,1530,POWER,5502
4,0777770001002,102,104,6,2,16,1,1,1530,POWER,5502
5,0777770001002,102,105,8,2,16,1,1,1530,POWER,5502
1,0777770001002,113,101,0,2,16,1,1,9999,MAP,5502
2,0777770001002,113,102,2,2,16,1,1,9999,MAP,5502
3,0777770001002,113,103,4,2,16,1,1,9999,MAP,5502
4,0777770001002,113,104,6,2,16,1,1,9999,MAP,5502
5,0777770001002,113,105,8,2,16,1,1,9999,MAP,5502
test.txt 이런 파일이있다
** 2번째 컬럼은 길이고정이고 계속 증가한다 1,2,3,4, 쭉
** 3번째 컬럼은 길이고정이고 맨앞자리는 고정
** 10번째 컬럼은 변하지 않음
** 11번째 컬럼이 MAP인 행들은 2번째 컬럼,3번째 컬럼이 순차적으로 증가하는 거고 나머지는 다 고정임
**해야할일**
./test.sh 1 3 이렇게 parameter 2개를 입력해 같이 실행하면
10번째 컬럼이 1530이면서 2번째 컬럼이 0777770001001 인 행들의 3번째컬럼 (101)을
103으로 바꿔야한다
=> 이렇게
1,0777770001001,103,101,0,2,16,1,1,1530,POWER,5502
2,0777770001001,103,102,2,2,16,1,1,1530,POWER,5502
3,0777770001001,103,103,4,2,16,1,1,1530,POWER,5502
4,0777770001001,103,104,6,2,16,1,1,1530,POWER,5502
5,0777770001001,103,105,8,2,16,1,1,1530,POWER,5502
1,0777770001001,112,101,0,2,16,1,1,9999,MAP,5502
2,0777770001001,112,102,2,2,16,1,1,9999,MAP,5502
3,0777770001001,112,103,4,2,16,1,1,9999,MAP,5502
4,0777770001001,112,104,6,2,16,1,1,9999,MAP,5502
5,0777770001001,112,105,8,2,16,1,1,9999,MAP,5502
1,0777770001002,102,101,0,2,16,1,1,1530,POWER,5502
2,0777770001002,102,102,2,2,16,1,1,1530,POWER,5502
3,0777770001002,102,103,4,2,16,1,1,1530,POWER,5502
4,0777770001002,102,104,6,2,16,1,1,1530,POWER,5502
5,0777770001002,102,105,8,2,16,1,1,1530,POWER,5502
1,0777770001002,113,101,0,2,16,1,1,9999,MAP,5502
2,0777770001002,113,102,2,2,16,1,1,9999,MAP,5502
3,0777770001002,113,103,4,2,16,1,1,9999,MAP,5502
4,0777770001002,113,104,6,2,16,1,1,9999,MAP,5502
5,0777770001002,113,105,8,2,16,1,1,9999,MAP,5502
#은 다 주석
#!/bin/bash
file=test.txt
devId=$( awk '/1530/' $file | cut -d ',' -f2 | sort -u )
#2번째컬럼 추출
existing_unitId=$( awk '/1530/' $file | cut -d ',' -f3 | sort -u )
#3번째컬럼 추출
devId_unitId=$( awk '/1530/' $file | cut -d ',' -f2,3 | sort -u )
#2번째,3번째 같이 추출
#forth_devId=${devId:0:11} # 2번째컬럼에서 뒤2자리 빼고 자르기
forth_unitId=${existing_unitId:0:1} # 3번째컬럼의 고정값 (맨 앞자리) 자르기
#echo "$devId"
#echo $existing_unitId
#echo $devId_unitId
#echo $forth_devId
#echo $forth_unitId
#sed -z 's/.*\(077777[^1]\+\).*/\1/g' $devId
forth_devId=$(echo $devId | cut -d ' ' -f$1)
forth_devId_code=${forth_devId:0:11}
echo $forth_devId_code
#Check the number of parameters
if [ $# -eq 0 ] ; then
echo "Warning: no arguments"
exit 0
elif [ $# -eq 1 ] || [ $# -ge 3 ] ; then
echo "Warning: You should input 2 parameter"
exit 0
else
echo "The number of parameters is 2 was checked "
fi
#Check parameter length
if [ ${#1} -ne 2 ] ; then
echo "Warning: You should input 2-digits parameter"
exit 0
elif [ ${#2} -ne 2 ] ; then
echo "Warning: You should input 2-digits parameter"
exit 0
fi
echo "The parameter length was checked"
for unitId in $devId_unitId; do
if [[ $unitId =~ $forth_devId_code$1 ]]; then
unitId=$(echo "${unitId#*,}")
vi -c "%s/$forth_devId_code$1,$unitId/$forth_devId_code$1,$forth_unitId$2/g" -c "wq" test.txt
echo "changed"
fi
done
업무 하면서 필요한 부분이라 만든 shellscript이다.
특정 패턴이 반복되고 특정 부분들만 변하는 파일인데
원하는 부분만 추출해서 변경해서 저장하기가 참 어렵당;;
그리고 vi편집기를 쓸때 vi로 직접 열어서 작업하고 저장하는게 아니고
저렇게 -c 를 쓰면 vi를 열지 않고 수정해서 저장이 가능함 *_*