개발 기록일지

쉘스크립트로 txt 내용 바꾸기 - vi 편집기 본문

프로그래밍/Linux,ShellScript

쉘스크립트로 txt 내용 바꾸기 - vi 편집기

JuoDev 2020. 9. 4. 16:09


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를 열지 않고 수정해서 저장이 가능함 *_*

'프로그래밍 > Linux,ShellScript' 카테고리의 다른 글

IPV6 -> IPV4 통신 방법  (0) 2021.09.07
리눅스 IPTABLE 사용 예시(특정 IP/PORT)  (0) 2021.08.30