var1からvar2への文字列マッピング(検索)

var1からvar2への文字列マッピング(検索)

VAR2の形式のいくつかのパラメータを使用して、VAR1の内容に基づいて大文字と小文字を区別しないクエリを実行したいと思いますkey。存在するvalue場合、VAR2の値を置き換えます。VAR1 key

たとえば、

VAR1=tom:rich,LIAm:viki
VAR2=liam,albert,tom

私が望む結果は次のとおりです。

VAR3='viki','albert','rich'

VAR1空になる可能性があります。

答え1

そしてzsh

VAR1=tom:rich,LIAm:viki
VAR2=liam,albert,tom

typeset -A map
for i ("${(@s(,))VAR1}") map[${(L)i%%:*}]=${i#*:}
out=()
for i ("${(@s(,))VAR2}") out+=${(qq)${map[${(L)i}]:-$i}}
VAR3=${(j(,))out}

printf '%s\n' "$VAR3"

出力:

'viki','albert','rich'

次のものと同じです(たとえば、Bourneに似たシェルで使用awkできます)。zshbash

VAR1=tom:rich,LIAm:viki
VAR2=liam,albert,tom

export VAR1 VAR2
awk -v q=\' 'BEGIN {
  n = split(ENVIRON["VAR1"], a, ",")
  for (i = 1; i <= n; i++) {
    k = v = a[i]
    sub(/:.*/, "", k)
    sub(/[^:]*:/, "", v)
    map[tolower(k)] = v
  }
  n = split(ENVIRON["VAR2"], a, ",")
  for (i = 1; i <= n; i++) {
    k = tolower(a[i])
    out = out sep q (k in map ? map[k] : a[i]) q
    sep = ","
  }
  print out
}'

(1つの違いは、ここでは値を一重引用符で囲むだけです。たとえば、値自体に一重引用符が含まれている場合はfoo'barwhile'foo'bar'が提供zshされます。)${(qq)var}'foo'\''bar'

このzshバージョンでは、アイテムのすべての値を受け入れます。改行、NUL、またはnull値を含む任意のバイト値を含めることができます。awkNULは環境変数に格納できず、実装によっては有効な文字を形成しないバイトを含むエントリをブロックする可能性があるため、このバージョンではNULをサポートしません。

VAR2=空のリストとして理解されるものと、2つの空の要素で構成されるリストとして理解される両方の場合、空の要素のVAR2=,リストを表現する方法はありません。

答え2

(レコード区切り記号)awkに基づいて使用:RS

VAR3=$(awk '
         BEGIN{RS="[,\n]";FS=":";ORS=","} 
         NR==FNR{a[tolower($1)]=$2}
         NR>FNR{printf "%s\047%s\047",(FNR>1?ORS:""),(a[$1]?a[$1]:$1)}
       ' <(echo "$VAR1") <(echo "$VAR2") 
      )

配列はキーと値のペアの内容でa埋められます。VAR1この変数は2番目の変数を解析するために使用され、配列項目がある場合は値が置き換えられます。

答え3

bash小文字キーと関連値を使用してテーブル(関連付け配列)を構築する(4.0+)ソリューションです。次に、ルックアップテーブルの値を繰り返してルックアップテーブルの値を使用するか、ルックアップテーブルに現在の文字列に対応するキーがない場合はビルドします。lookupVAR1VAR2VAR3VAR2VAR2

VAR1=tom:rich,LIAm:viki
VAR2=liam,albert,tom

declare -A lookup

# build lookup table
while read -d , key_value; do
    # $key_value is a string like "tom:rich", separate these into key and value:
    IFS=: read key value <<<"$key_value"

    # add lower-cased key to table with value
    lookup[${key,,}]=$value
done <<<"$VAR1,"

# do lookups in table
while read -d , string; do
    # get newstring from table, but use $string if there's no entry:
    newstring=${lookup[${string,,}]:-$string}

    # add $newstring to VAR3, with a delimiting comma unless VAR3 is empty
    VAR3+="${VAR3:+,}'$newstring'"
done <<<"$VAR2,"

printf 'VAR3 = %s\n' "$VAR3"

このコードは以下を出力します。

VAR3 = 'viki','albert','rich'

VAR1これは、合計の値にVAR2改行文字が含まれていないと仮定します。

関連情報