Array and field separator


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Array and field separator
# 1  
Old 08-31-2011
Array and field separator

Hi all,

I have an array in BASH and I need to change the IFS in order to split up it correctly.
Here an example:
Code:
array_test=(hello world+sunny)

for elem in ${array_test[@]}; do
  echo $elem
done

echo -e "\n changed IFS \n"
OLD_IFS=$IFS
IFS=+

for elem in ${array_test[@]}; do
  echo $elem
done

here the output:

Code:
hello
world+sunny

 changed IFS

hello
world
sunny

The first 2 lines are printed correctly but after the modification of IFS I was expecting a different output according to the new + separator like:
Code:
hello world
sunny

Am I missing something?

thanks in advance
# 2  
Old 08-31-2011
Code:
IFS=+
for elem in `echo "${array_test[@]}"`; do
   echo $elem
done
hello world
sunny

# 3  
Old 08-31-2011
Hi
Thanks for reply, I figure out also another way:
just add double quote to the array
Code:
array_test=("hello world+sunny")

hello world
sunny

# 4  
Old 08-31-2011
The shell field/word splitting occurs only on expansion.

From the manual pages of bash:
Quote:
Word Splitting
The shell scans the results of parameter expansion, command substitution, and arithmetic expansion that did not
occur within double quotes for word splitting.
[...]

Note that if no expansion occurs, no splitting is performed.
So:

Code:
4.1.10(4)-release$ IFS=+
4.1.10(4)-release$ a=( one+two )
4.1.10(4)-release$ echo "${a[0]}"
one+two

Use some kind of expansion:

Code:
4.1.10(4)-release$ s='one+two'
4.1.10(4)-release$ a=( $s )
4.1.10(4)-release$ echo "${a[0]}"
one

Consider the following:

Code:
elements='hello world+sunny'

# $elements is not quoted so it is
# subject to word splitting
# based on the current value
# of IFS

array_test=( $elements )

for elem in "${array_test[@]}"; do
  printf '%s\n' "$elem"
done

printf '\nChanging IFS to %s\n\n' +

IFS=+

# we need to reassign 
# in order to perform word
# splitting based on the 
# new IFS value

array_test=( $elements )

for elem in "${array_test[@]}"; do
  printf '%s\n' "$elem"
done


This is the output:


Code:
4.1.10(4)-release$ ./s
hello
world+sunny

Changing IFS to +

hello world
sunny

With recent versions of bash you could use something like this too:


Code:
4.1.10(4)-release$ IFS=+ read -ra arr <<<'one+two'
4.1.10(4)-release$ printf '%s\n' "${arr[0]}"
one


Last edited by radoulov; 08-31-2011 at 10:12 AM..
This User Gave Thanks to radoulov For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Inserting a field without disturbing field separator on other fields

Hi All, I have the input as below: cat input 032016002 2.891 97.109 16.605 27.172 24.017 32.207 0.233 0.021 39.810 0.077 0.026 19.644 13.882 0.131 11.646 0.102 11.449 76.265 23.735 16.991 83.009 8.840 91.160 0.020 99.980 52.102 47.898 44.004 55.996 39.963 18.625 0.121 1.126 40.189... (15 Replies)
Discussion started by: am24
15 Replies

2. Shell Programming and Scripting

Field separator

Hello All, I have a file, but I want to separate the file at a particular record with comma"," in the line Input file APPLE6SSAMSUNGS5PRICEPERPIECEDOLLAR600EACH010020340URX581949695US to Output file APPLE6S,SAMSUNGS5,PRICEPERPIECE,DOLLAR600EACH,010020340URX581949695,US This is for... (11 Replies)
Discussion started by: m6248m
11 Replies

3. Shell Programming and Scripting

awk field separator help -

Hi Experts , file : - How to construct the awk filed separator so that $1, $2 $3 , can be assigned to the each "" range. I am trying : awk -F"]" '{print $1}' but it is printing the entire file. Not first field. The desired output needed for first field... (9 Replies)
Discussion started by: rveri
9 Replies

4. Shell Programming and Scripting

awk field separator

I need to set awk field separator to ";", but I need to avoid ";EXT". so that echo a;b;c;EXTd;e;f | awk -F";" '{print $3}' would give "c;EXTd" (2 Replies)
Discussion started by: locoroco
2 Replies

5. UNIX for Dummies Questions & Answers

change field separator only from nth field until NF

Hi ! input: 111|222|333|aaa|bbb|ccc 999|888|777|nnn|kkk 444|666|555|eee|ttt|ooo|ppp With awk, I am trying to change the FS "|" to "; " only from the 4th field until the end (the number of fields vary between records). In order to get: 111|222|333|aaa; bbb; ccc 999|888|777|nnn; kkk... (1 Reply)
Discussion started by: beca123456
1 Replies

6. Shell Programming and Scripting

Strings as Field separator

Hi, How i can use two strings as field separator.. I want to use filed separator's as &lt; and &gt; input - shdhd ads&lt;adsd adfs &gt;sdfsd sfsdfsd&lt; Please help me in this..:wall: thanks a lot... (3 Replies)
Discussion started by: pamu
3 Replies

7. Shell Programming and Scripting

echo field separator

I am trying to echo all fields except for the last field. I want to include the field seperator, but it is removed. echo "a;s;v;g" | awk -F ";" '{$(NF--)=""; print}' a s v I want an output like this: a;s;v; (3 Replies)
Discussion started by: locoroco
3 Replies

8. Shell Programming and Scripting

Field separator X'1F'

Hi, I have a flat file with fields separated by a X'1F' i have to fetch 4th field from second line. please help me how to achieve it. I tried with below command and its not working. cut -f4 -d`echo -e '\x1f'` filename.txt I am using SunOS. Thanks in advance. (2 Replies)
Discussion started by: rohan10k
2 Replies

9. Shell Programming and Scripting

awk, comma as field separator and text inside double quotes as a field.

Hi, all I need to get fields in a line that are separated by commas, some of the fields are enclosed with double quotes, and they are supposed to be treated as a single field even if there are commas inside the quotes. sample input: for this line, 5 fields are supposed to be extracted, they... (8 Replies)
Discussion started by: kevintse
8 Replies

10. Shell Programming and Scripting

field separator as regexp

I have some version of AWK that does not support regular expression field separators ( neither do I have nawk or gawk). How do I go about reading a line with the field separator as either the string "=#" or "+=". My data looks like this: abhishek=#nnnnn+#1234+#87 One option is to use... (2 Replies)
Discussion started by: Abhishek Ghose
2 Replies
Login or Register to Ask a Question