简体   繁体   中英

how to use values with sed in shell scripting?

i am trying te write a shell script in alphametic,

i have 5 parameters like this

$alphametic 5790813 BEAR RARE ERE RHYME

to get

ABEHMRY -> 5790813

i tried this:

  #!/bin/bash
    echo "$2 $3 $4 $5" | sed  's/ //g ' | sed 's/./&\n/g' | sort -n |  sed '/^$/d' | uniq -i > testing
    paste -sd ''  testing  > testing2 
    sed "s|^\(.*\)$|\1 -> ${1}|" testing2 

but i get error (with the last command sed ), i dont know where is the problem.

#!/bin/sh

val="$1"

shift

printf '%s' "$@" | awk -v FS='' -v OFS='\n' '{$1=$1}1' | sort -n | uniq | tr -d '\n'

printf " -> %s\n" "$val"

edit: Fixed order in output

  • shift removes $1 from the arguments. $@ will then contain all the arguments but the first one, and the old $2 will then be $1 , $3 will be $2 , etc...
  • printf '%s' "$@" concatenates all the arguments into a single string
  • awk -v FS='' -v OFS='\n' '{$1=$1}1' outputs each character vertically
  • tr -d '\n' removes all \n characters

remark: I didn't add the -i option to uniq because my OS didn't recognize it.

One idea using awk for the whole thing:

arg1="$1"
shift
others="$@"

awk -v arg1="${arg1}" -v others="${others}" '
BEGIN { n=split(others,arr,"")                 # split into into array of single characters
        for (i=1;i<=n;i++)                     # loop through indices of arr[] array
            letters[arr[i]]                    # assign characters as indices of letters[] array; eliminates duplicates
        delete letters[" "]                    # delete array index for "<space>"
        PROCINFO["sorted_in"]="@ind_str_asc"   # sort array by index
        for (i in letters)                     # loop through indices
            printf "%s", i                     # print index to stdout
        printf " -> %s\n", arg1                # finish off line with final string
      }
'

NOTE: requires GNU awk for the PROCINFO["sorted_in"] (to sort the indices of the letters[] array)

This generates:

ABEHMRY -> 5790813

Another approach:

chars=$(printf '%s' "${@:2}" | fold -w1 | sort -u | paste -sd '')
echo "$chars -> $1"

sort's -n does't make sense here: these are letters, not numbers.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM