파일 이름을 구문 분석하고 이를 기반으로 변수(코드)를 할당하고 싶습니다. 컷을 사용하여 각 값을 얻을 수 있다고 생각합니다. 그런데 명령 하나로 할 수 있을까요?
샘플 파일 이름: 012345678_012345678-abcdefghijklmnop_YYYYMMDD_TTTT
2차 예선부터 시작012345678변수(코드)에 값을 할당해야 합니다.
col-2와 col-3이 yy이고 col-4와 col-5가 00, 01 또는 02이고 col 678이 'abc'인 경우 할당 코드 = usa
col-2와 col-3이 yy이고 col-4와 col-5가 00, 01 또는 02이고 col 678이 'abc'와 같지 않은 경우 할당 코드 = uk
col-2 & col-3이 yy와 같지 않고 col-4 & col-5가 00, 01 또는 02와 같지 않고 col 678이 'abc'와 같지 않은 경우 코드 = Aus를 지정하십시오.
노트: 두 번째 한정자는 항상 첫 번째 밑줄 뒤와 첫 번째 대시 앞에 옵니다. yy는 col -2 및 col-3 위치에 있는 두 번째 한정자의 값입니다.
파일 이름 예시: 012345678_01yy00abc-xxxxxxxxxxxxxxxxxxxxx_20180408_1300 할당 코드 = usa
파일 이름 예: 012345678_01yy00xyz-xxxxxxxxxxxxxxxxxxxxx_20180408_1300 할당 코드 = uk
파일 이름 예시: 012345678_01aa98def-xxxxxxxxxxxxxxxxxxxxx_20180408_1300 할당 코드 = Aus(즉, 미국이나 영국이 아닌 경우 Aus)
답변1
다음 bash 스크립트는 현재 디렉터리에서 패턴(무언가) 밑줄(무엇) 대시(무엇) 밑줄(무엇) 밑줄(무엇)과 일치하는 모든 파일을 반복한 다음 비교할 관련 필드를 선택합니다. 이 구문의 의미는 ${field:4:2}
위치 4에서 시작하는 값을 가져오고 두 문자를 추출하는 것입니다.$field
그런 다음 나열된 논리를 기반으로 부품을 비교하고 code
변수를 할당합니다.
#!/bin/bash
for f in *_*-*_*_*
do
field=${f#*_}
field=${field%%-*}
col23=${field:2:2}
col45=${field:4:2}
col678=${field:6:3}
if [ "$col23" = "yy" ]
then
case $col45 in
(00|01|02)
if [ "$col678" = "abc" ]
then
code=usa
else
code=uk
fi
;;
(*)
code=Aus
;;
esac
else
code=Aus
fi
echo "For file $f, code is: $code"
done
답변2
단 하나의 정규식으로 모든 필드를 제공합니다.
모든 조건을 테스트하려면 하나의 사례 문만 필요합니다.
#!/bin/bash
a='[^_]+_' b='[^-]{2}' c='[^-]{3}'
regex="^$a($b($b)($b)($c))-$a$a.*$"
for f in *_*-*_*_*; do
if [[ $f =~ $regex ]]; then
arr=("${BASH_REMATCH[@]:1}")
# echo "field=${arr[0]} col23=${arr[1]} col45=${arr[2]} col678=${arr[3]}"
a=0; b=0; c=0
[[ ${arr[1]} == "yy" ]] && a=1
[[ ${arr[2]} == @(00|01|02) ]] && b=1
[[ ${arr[3]} == "abc" ]] && c=1
case $a$b$c in
(111) code=usa ;;
(110) code=uk ;;
(*) code=Aus ;;
esac
echo "For file $f, code is: $code"
fi
done