Construct Array from String seperated by different whitespaces


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Construct Array from String seperated by different whitespaces
# 1  
Old 09-18-2019
Construct Array from String seperated by different whitespaces

My string variable which gets the output from the result of a database query has values as below:

Code:
line="2019-09-11 15:17:55 CR1234 anonymous       Deployed        DR_only        Back_APP"

I wish to construct an array (my_array) which should have entries as below.

Quote:
my_array[0]=2019-09-11 15:17:55
my_array[1]=CR1234
my_array[2]=anonymous
my_array[3]=Deployed
my_array[4]=DR_only
my_array[5]=Back_APP
Note:
1. The first two strings seperated by whitespace combines to be the first element of the array.
2. Not all white spaces between the strings are the same.

Below code code does not split all the elements of the string as desired.

Code:
      IFS=$' ' read -ra my_array <<< "$line"
      #Print the split string
      for i in "${my_array[@]}"
      do
         echo $i
      done

Can you please propose a viable solution ?

I m on Redhat Linux centos 7 using bash.
# 2  
Old 09-18-2019
Hi,

I have done the following to your code;

Code:
IFS=$' ' read -ra my_array <<< "Filesystem            kbytes    used   avail capacity  Mounted on"
#Print the split string
for i in "${my_array[@]}"
do
     echo $i
done

And get the following result;

Code:
-bash-3.2$ ./arrtest.sh
Filesystem
kbytes
used
avail
capacity
Mounted
on
-bash-3.2$

Can you post your output? Could there be any non printing characters in the sql output - well other than a tab?

Regards

Gull04
# 3  
Old 09-18-2019
I tried your suggestion and it does not yeild any output. However, the tr command helps reconstruct the variable to have a single space only.

The challenge remains of how to get the first two words seperated by single space get stored as first array element and then the rest of the words as subsiquent array elements.

Code:
$ IFS=$' ' read -ra my_array <<<"2019-09-11 15:17:55 CR1234 anonymous       Deployed        DR_only        Back_APP" 
$ echo $?
0
$ echo "2019-09-11 15:17:55 CR1234 anonymous       Deployed        DR_only        Back_APP" |  tr -s " "
2019-09-11 15:17:55 CR1234 anonymous Deployed DR_only Back_APP

# 4  
Old 09-18-2019
Hi Motashims,

I've tried this on a couple of systems and get the following - for Solaris;

Code:
-bash-3.2$ cat arrtest.sh
IFS=' ' read -ra my_array <<< "2019-09-11 15:17:55 CR1234 anonymous       Deployed        DR_only        Back_APP"
#Print the split string
for i in "${my_array[@]}"
do
     echo $i
done
-bash-3.2$ ./arrtest.sh
2019-09-11
15:17:55
CR1234
anonymous
Deployed
DR_only
Back_APP
-bash-3.2$ uname -a
SunOS isd250 5.10 Generic_150400-46 sun4v sparc sun4v
-bash-3.2$ bash --version
GNU bash, version 3.2.52(1)-release (sparc-sun-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.
-bash-3.2$

And on a much later version of Red Hat;

Code:
[root@fbakirpomd4 bin]# cat arrtest.sh
IFS=' ' read -ra my_array <<< "2019-09-11 15:17:55 CR1234 anonymous       Deployed        DR_only        Back_APP"
#Print the split string
for i in "${my_array[@]}"
do
     echo $i
done
[root@fbakirpomd4 bin]# ./arrtest.sh
2019-09-11
15:17:55
CR1234
anonymous
Deployed
DR_only
Back_APP
[root@fbakirpomd4 bin]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.5 (Maipo)
[root@fbakirpomd4 bin]# bash --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@fbakirpomd4 bin]#

I'm unable to replicate the issue - I think.

Regards

Gull04
# 5  
Old 09-18-2019
Can you share the logic / code to add first two elements seperated by single space to array[0] and the next elements thereon ?
# 6  
Old 09-18-2019
Hi Motashims,

I have shared everything with you, can I ask what output are you expecting?

Am I right in assuming that you expect different output from above, maybe.

Code:
2019-09-11 15:17:55
CR1234
anonymous
Deployed
DR_only
Back_APP

Regards

Gull04

--- Post updated at 01:35 PM ---

Hi Motashims,

Is the following what you expect?

Code:
-bash-3.2$ cat -v -t arrtest.sh
IFS='^I' read -ra my_array <<< "2019-09-11 15:17:55^ICR1234^Ianonymous^IDeployed^IDR_only^IBack_APP"
#Print the split string
for i in "${my_array[@]}"
do
     echo $i
done
-bash-3.2$ ./arrtest.sh
2019-09-11 15:17:55
CR1234
anonymous
Deployed
DR_only
Back_APP
-bash-3.2$

Here you have to explicitly set the IFS to the tab character, this will ignore the space.

Regards

Gull04

--- Post updated at 01:35 PM ---

Hi Motashims,

Is the following what you expect?

Code:
-bash-3.2$ cat -v -t arrtest.sh
IFS='^I' read -ra my_array <<< "2019-09-11 15:17:55^ICR1234^Ianonymous^IDeployed^IDR_only^IBack_APP"
#Print the split string
for i in "${my_array[@]}"
do
     echo $i
done
-bash-3.2$ ./arrtest.sh
2019-09-11 15:17:55
CR1234
anonymous
Deployed
DR_only
Back_APP
-bash-3.2$

Here you have to explicitly set the IFS to the tab character, this will ignore the space.

Regards

Gull04
This User Gave Thanks to gull04 For This Post:
# 7  
Old 10-01-2019
You could use a function to extract the required elements like this:

Code:
function splitarr {
    local pos=0 word=0 items value i
    local wrd=( $1 )
    for items in $3
    do
       value=""
       for((i=0;i<$items;i++))
       do
          [ $i -gt 0 ] && value="$value "
          value="$value${wrd[$word]}"
          (( word++ ))
       done
       printf -v $2[$pos] "%s" "$value"
       (( pos++ ))
    done
}

line="2019-09-11 15:17:55 CR1234 anonymous Deployed     DR_only Back_APP"
splitarrr "$line" my_array "2 1 1 1 1 1"
for((i=0;i<${#my_array[@]};i++))
do
    echo "my_array[$i]=${my_array[i]}"
done

Output:
Code:
my_array[0]=2019-09-11 15:17:55
my_array[1]=CR1234
my_array[2]=anonymous
my_array[3]=Deployed
my_array[4]=DR_only
my_array[5]=Back_APP

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

awk Associative Array and/or Referring to Field by String (Nonconstant String Value)

I will start with an example of what I'm trying to do and then describe how I am approaching the issue. File PS028,005 Lexeme HRS # M # PhraseType 1(1:1) 7(7) PhraseLab 501 503 ClauseType ZYq0 PS028,005 Lexeme W # L> # BNH # M #... (17 Replies)
Discussion started by: jvoot
17 Replies

2. Shell Programming and Scripting

Seperated a Column from 'ESC' Character seperated file

Hi Experts I have an escape seperated fields in the unix file. And in the below format file I need to extract the first column. Please help its urgent. cat -v op.dat | head 24397028^ I want to extract the file in below format ( with only first column ) 24397028 2439707 thanks. ... (6 Replies)
Discussion started by: neha_suri06
6 Replies

3. OS X (Apple)

Create a bash array from a flat file of whitespaces only.

Hi guys and gals... MacBook Pro. OSX 10.13.2, default bash terminal. I have a flat file 1920 bytes in size of whitespaces only. I need to put every single whitespace character into a bash array cell. Below are two methods that work, but both are seriously ugly. The first one requires that I... (7 Replies)
Discussion started by: wisecracker
7 Replies

4. Shell Programming and Scripting

For loop; how to construct a array with variables

Hi everybody!! Here is the thing; I have a trouble in this simple situation, I'm trying to write an array with all the arguments of a command. I mean, if I have: ./mycommand.sh aa bb cc dd I need to take an array like this: myarray=(aa bb cc dd) So I use a simple for loop like this: for... (4 Replies)
Discussion started by: andresgom
4 Replies

5. Shell Programming and Scripting

PERL : Read an array and write to another array with intial string pattern checks

I have an array and two variables as below, I need to check if $datevar is present in $filename. If so, i need to replace $filename with the values in the array. I need the output inside an ARRAY How can this be done. Any help will be appreciated. Thanks in advance. (2 Replies)
Discussion started by: irudayaraj
2 Replies

6. Shell Programming and Scripting

Convert comma seperated file to line seperated.

Hi, I have data like this. 1,2,3,4 Output required: 1 2 3 4 I am trying to use tr function but getting error. Help is appreciated. (6 Replies)
Discussion started by: pinnacle
6 Replies

7. Shell Programming and Scripting

Substring in string with whitespaces

hello, i have this string: variable="1234 /PARAMETER_1:text /PARAMETER_2:othertext" i tried to do expr match $variable '.*\(*\)' but i keep getting expr error i need to extract the word text... thank you (4 Replies)
Discussion started by: Aloush89
4 Replies

8. Shell Programming and Scripting

construct a string with X number of spaces

I'd like to create a variable with the value of X number of space( no Perl please), printf seems to work, but , in following example,10 spaces becomes 1 space when assinged to a variable, Why? other solutions are welcome. $printf "=%10s=\n" = = $var=$(printf "=%10s=\n") echo... (4 Replies)
Discussion started by: honglus
4 Replies

9. Shell Programming and Scripting

Removing blank lines from comma seperated and space seperated file.

Hi, I want to remove empty/blank lines from comma seperated and space seperated files Thanks all for help (11 Replies)
Discussion started by: pinnacle
11 Replies

10. Shell Programming and Scripting

To split a string to obtain the words delimited by whitespaces

Please can someone thow some light what is the best way to split a string to obtain the words delimited by whitespaces. (4 Replies)
Discussion started by: Sudhakar333
4 Replies
Login or Register to Ask a Question