Dear All,
forgive me as i am a complete beginner in shell scripting in UNIX.
I have a file with data similair to the following
8 McDonalds Sandwich 1.99
9 Mcdonalds Fries 1.20
13 McDonalds Milkshake 1.20
7 KFC Fillet Tower 2.50
15 KFC Fries 1.00
3 Burger King Whopper 2.99
14 Burger King Fries 1.40
17 Burger King Soda 1.60
I want to arrange this file so instead of the above, the information is shown in the following pattern;
McDonalds
Fries 9 1.20
Sandwich 8 1.99
Milkshake 13 1.20
And so on for KFC & Burger King ...
what is important is the way McDonalds is now as a heading with its menu being summarised.
Sorry if i havnt explained this well!!
Please can sum1 help me?
I know it involves writing a script in awk or sed but not sure how to start.
Major thanks in advance thank u
Mary
anbu23
September 14, 2006, 5:22pm
2
awk ' { if ( nm != to_lower($2) { nm=to_lower($2);print nm }
printf("%s",$1)
for( i = 3; i <= NF ; ++i )
printf(" %s",$i)
printf("\n")
}' file
Or:
Because your data has no conclusive way to tell fields apart, you need to
add field sep characters. I used | - without this you would have to resort
to a huge nest of if-then-else logic, because you want to rearrange by what
amounts to a single number column then a multi-column value (1..2)
data
8 |McDonalds| Sandwich| 1.99
9 |McDonalds| Fries |1.20
13|McDonalds| Milkshake 1.20
7 |KFC| Fillet Tower |2.50
15|KFC| Fries |1.00
3 |Burger King| Whopper |2.99
14|Burger King| Fries |1.40
17|Burger King| Soda |1.60
awk -F'|' '{if($2!=old) {print $2; old=$2}
print $3,$1,$4
}' filename
output
McDonalds
Sandwich 8 1.99
Fries 9 1.20
Milkshake 1.20 13
KFC
Fillet Tower 7 2.50
Fries 15 1.00
Burger King
Whopper 3 2.99
Fries 14 1.40
Soda 17 1.60
Anbu does your code produce this output?
anbu23
September 14, 2006, 5:40pm
4
It wont produce that output.
nervous
September 16, 2006, 12:55am
5
Hi Anbu23,
Can you pls explain the following awk code:
awk ' { if ( nm != to_lower($2) { nm=to_lower($2);print nm }
printf("%s",$1)
for( i = 3; i <= NF ; ++i )
printf(" %s",$i)
printf("\n")
}' file
Thanks in advance.
alternative in Python:
#assume known data of food provider.
data = ['McDonalds' , 'KFC' , 'Burger King']
basket = {} #to store results
def insert(dictionary,key,val):
if dictionary.has_key(key):
dictionary[key].append(val)
else:
dictionary[key] = [val]
for items in data:
for lines in open("inputfile.txt"):
splitted = lines.split(" ")
qty,middle,price = splitted[0], ' '.join(splitted[1:-1]), splitted[-1]
if items in middle:
food = middle[len(items):] #eg get Fries, Whopper
insert(basket,items, ' '.join([food,qty,price]))
for i in sorted(basket.keys()):
print i
print " " + ' '.join(basket)
print
Output:
/home> python test.py
Burger King
Whopper 3 2.99
Fries 14 1.40
Soda 17 1.60
KFC
Fillet Tower 7 2.50
Fries 15 1.00
McDonalds
Sandwich 8 1.99
Fries 9 1.20
Milkshake 13 1.20
sayonm
September 16, 2006, 4:15am
7
for ((i=1;i<=`awk -F'|' '{print $2}' file | uniq | wc -l`;i++))
do
word=`awk -F'|' '{print $2}' file | uniq |head -$i | tail -1`
echo $word
grep "$word" file | awk -F'|' '{print $3,$1,$4}'
done
the output is as follows:-
[sayonm@zion ~]$ sh script.sh
McDonalds
Sandwich 8 1.99
Fries 9 1.20
Milkshake 13 1.20
KFC
Fillet Tower 7 2.50
Fries 15 1.00
Burger King
Whopper 3 2.99
Fries 14 1.40
Soda 17 1.60
NOTE: assumed that the file was delimited by "|"
cheers,
Sayon
ps: edited previous post
just my opinion, there are too many pipes , and file i/o.
sayonm
September 16, 2006, 4:54am
9
ya right.....just my style
anyways i just wrongly named my previous post as "just another simple soln"....it should have been "just another soln".....
awk -F" " 'BEGIN{x=""} { if ( $2 != x ) { print $2, "\n", $3, $1, $4; x=$2 } else { print $3, $1, $4 } }' filename