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
}'

(한 가지 차이점은 여기서는 값을 작은따옴표로만 묶는다는 것입니다. 예를 들어 값 자체에 작은따옴표가 포함되어 있으면 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이 변수는 두 번째 변수를 구문 분석할 때 사용되며 배열 항목이 있으면 값이 대체됩니다.

답변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개행 문자가 포함되어 있지 않다고 가정합니다.

관련 정보