ファイル名を解析し、それに基づいて変数(コード)を割り当てたいと思います。カットを使って各値が得られると思います。ところで、コマンド一つでできるのでしょうか?
サンプルファイル名:012345678_012345678-abcdefghijklmnop_YYYYMMDD_TTTT
二次予選からスタート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 を指定します。
ノート: 2番目の修飾子は、常に最初の下線の後と最初のダッシュの前に続きます。 yyは、col -2およびcol-3の位置にある2番目の修飾子の値です。
ファイル名の例: 012345678_01yy00abc-xxxxxxxxxxxxxxxxxxxxxxxx_20180408_1300 割り当てコード = usa
ファイル名の例: 012345678_01yy00xyz-xxxxxxxxxxxxxxxxxxxxxxxx_20180408_1300 割り当てコード = uk
ファイル名の例:012345678_01aa98def-xxxxxxxxxxxxxxxxxxxxx_20180408_1300割り当てコード= Aus(つまり、米国または英国ではない場合はAus)
答え1
次のbashスクリプトは、現在のディレクトリでパターン(何か)下線(何)ダッシュ(何)下線(何)下線(何)に一致するすべてのファイルを繰り返し、比較する関連フィールドを選択します。この構文の意味は、${field:4:2}
位置4から始まる値を取得し、2文字を抽出することです。$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
単一の正規表現ですべてのフィールドを提供します。
すべての条件をテストするには、1つのケースステートメントのみが必要です。
#!/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