Sorting the contents of a variable


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Sorting the contents of a variable
# 1  
Old 05-10-2019
Sorting the contents of a variable

i want to reduce the OPTIONS variable which is a list of email addresses to just the unique entries. The following works, but, i would like to accomplish it without using the temporary file (dest.txt)



Code:
$echo $OPTIONS                         
a b c A B D                                         
$cat clean                             
#!/usr/bin/bash                                     
n=$#                                                
i=1                                                 
cat /dev/null >/usr/spool/lp/temp/dest.txt          
while [ $i -le $n ]                                 
do                                                  
        c=$(echo $1 |tr "[:upper:]" "[:lower:]" )   
        echo $c>>/usr/spool/lp/temp/dest.txt        
        shift                                       
        let i=$i+1                                  
done                                                
sort -u </usr/spool/lp/temp/dest.txt                
                                                    
$ OPTIONS1=$(./clean $OPTIONS)          
$ echo $OPTIONS1                        
a b c d                                             
$

# 2  
Old 05-10-2019
Code:
echo "4 2 d c b 1 a b A b 1 B C a b c d" | ./clean.awk

# output
 a b c d 1 2 4

clean.awk
Code:
#!/usr/bin/awk -f
{
   for(i=1;i<=NF;i++)
      a[tolower($i)]=1
} 

END{ 
   for(i in a)
      printf i " "
   printf "\n"
}

awk seems to have a sorting algorithm when accessing lists.

...or in one line:

Code:
echo "4 2 d c b 1 a b A b 1 B C a b c d" | awk '{for(i=1;i<=NF;i++) {a[tolower($i)]=1}} END{for(i in a) {printf i " "} ; printf "\n"}'

# 3  
Old 05-10-2019
How about:

Code:
OPTIONS="a b c A B D"

OPTIONS=$( \
               echo "${OPTIONS}" | \
               tr " " "\n" | \
               tr "[:upper:]" "[:lower:]" | \
               sort -u | \
               tr "\n" " " \
         )

I've just broken up the lines for clarity. Does that do the job?

Not a great plan if the content of $OPTIONS is very large (a few million items) and would be terrible with any values containing a space.

Also, don't call this in a loop because of the many many processes it might create and the costs associated with that.




Robin
# 4  
Old 05-10-2019
After a little thought:
Code:
#!/usr/bin/bash                                   
n=$#                                              
i=1                                               
C=""                                              
while [ $i -le $n ]                               
do                                                
        c=$(echo $1 |tr "[:upper:]" "[:lower:]" ) 
        C="$c\n$C"                                
        shift                                     
        let i=$i+1                                
done                                              
echo $C |sort -u

# 5  
Old 05-10-2019
How about
Code:
$ echo $(shuf -e ${OPTIONS,,} | sort -u)
 a b c d

(provided your system's bash provides "Parameter Expansion / Case modification" and shuf has the -e option)


EDIT: or

Code:
$ echo $( xargs -n1 -d" " <<< ${OPTIONS,,} | sort -u)
 a b c d


or, of course,

Code:
$ echo $( tr ' ' '\n' <<< ${OPTIONS,,} | sort -u)


Last edited by RudiC; 05-10-2019 at 06:27 PM..
This User Gave Thanks to RudiC For This Post:
# 6  
Old 05-10-2019
Assuming that $OPTIONS does not expand to a string containing anything other than alphanumeric characters and <space>s, one could also use:
Code:
echo $(echo $OPTIONS|tr ' [:upper:]' '\n[:lower:]'|sort -u)

without worrying about having a shell that supports the case modification parameter expansion or the shuf utility which are both extensions to the standards.
This User Gave Thanks to Don Cragun For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Storing file contents to a variable

Hi All, I was trying a shell script. I was unable to store file contents to a variable in the script. I have tried the below but unable to do it. Input = `cat /path/op.diary` Input = $(<op.diary) I am using ksh shell. I want to store the 'op.diary' file contents to the variable 'Input'... (12 Replies)
Discussion started by: am24
12 Replies

2. Shell Programming and Scripting

Folder contents getting appended as strings while redirecting file contents to a variable

Hi one of the output of the command is as below # sed -n "/CCM-ResourceHealthCheck:/,/---------/{/CCM-ResourceHealthCheck:/d;/---------/d;p;}" Automation.OutputZ$zoneCounter | sed 's/$/<br>/' Resource List : <br> *************************** 1. row ***************************<br> ... (2 Replies)
Discussion started by: vivek d r
2 Replies

3. Shell Programming and Scripting

Providing variable contents to awk

Hello, All. This is my first post here, and I expect that the answer is simple, but I can't find it. Might be the way I'm searching. I'm fairly new to Unix/Linux, and I'm writing a Korn Shell Script. I am trying to provide a value that is already in a variable to awk so that awk can pull out the... (3 Replies)
Discussion started by: compguy74
3 Replies

4. Homework & Coursework Questions

How to read contents of a file into variable :(

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: I have to read the contents of each field of a file creating user accounts. The file will be of format : ... (6 Replies)
Discussion started by: dude_me5
6 Replies

5. Shell Programming and Scripting

How to read contents of a file into variable :(

My file is in this format : username : student information : default shell : student ID Eg : joeb:Joe Bennett:/bin/csh:1234 jerryd:Jerry Daniels:/bin/csh:2345 deaverm: Deaver Michelle:/bin/bash:4356 joseyg:Josey Guerra:/bin/bash:8767 michaelh:Michael Hall:/bin/ksh:1547 I have to... (1 Reply)
Discussion started by: dude_me5
1 Replies

6. Shell Programming and Scripting

how to grep the contents of a variable..

Hello All, I've written a script to collect all audit logs files; now i want to see only the files from it which contains certain x tablenames. I've stored all the tablenames in a log file and using it through variable in a script (ex:below) $ more tablenames.log (this is just a samle... (2 Replies)
Discussion started by: suri.tyson
2 Replies

7. Shell Programming and Scripting

Storing the contents of a file in a variable

There is a file named file.txt whose contents are: +-----------------------------------+-----------+ | Variable_name | Value | +-----------------------------------+-----------+ | Aborted_clients | 0 | | Aborted_connects | 25683... (6 Replies)
Discussion started by: proactiveaditya
6 Replies

8. Shell Programming and Scripting

unique sort contents of a variable

Hi , I have #echo $var1 #hdisk2 hdisk3 hdisk0 hdisk2 Now I need to remove duplicate entries from this . ie. after sorting it should only have hdisk2 hdisk3 hdisk0 . I can have these values in a array as well . I understand we can use sort -u to remove the duplicates in a... (2 Replies)
Discussion started by: praveenbvarrier
2 Replies

9. UNIX for Dummies Questions & Answers

Save contents of a Variable

I want to save the contents of a variable to a file. How can that be achieved? I have tried with: echo $varname > textfile.txt but for some reason it does not print anything. (1 Reply)
Discussion started by: carl_vieyra
1 Replies

10. Shell Programming and Scripting

adding contents of a variable to a command

hi all, i'm new to shell scripting, so i'm not sure how to work this. Is it possible to read in the contents of a variable and add it to a command? for example: ------------------------ #!/bin/sh set example = -dfr rm ${example} ------------------------ when i run the script, i want... (2 Replies)
Discussion started by: gammarays
2 Replies
Login or Register to Ask a Question