ファイル名パーサー

ファイル名パーサー

ファイル名を解析し、それに基づいて変数(コード)を割り当てたいと思います。カットを使って各値が得られると思います。ところで、コマンド一つでできるのでしょうか?

サンプルファイル名: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

関連情報