Tom's Guide | Tom's Hardware | Tom's Games
![]() |
![]() |
![]() |
Help! If for example I have this kind of table:
black 4-feb-2001
green 3-mar-2002
blue 6-jun-2003
red 1-jan-2000Can I output it in such a way that it gets sorted by the value of the second field? Like if I want to sort the dates by ascending or descending order? How about displaying just the results that fall within a given range, say just those from jan2000-mar2002?
Any help would be VERY MUCH appreciated!

Hope this helps you.
#!/usr/bin/ksh
# ----- file t
# black 4-feb-2001
# green 3-mar-2002
# blue 6-jun-2003
# red 1-jan-2000# Separate the date part from source and store in tempfile
cat t | nawk '{print $2 }' > p
# Use the tempfile as input break it on -, and get the month part and store in another file
# sort -M to sort as months. ( reference from UNIX man pages )cat p | nawk -F"-" '{print $2}' | sort -M > m
# the for loop will get each element
# using grep on original source file each time getting datafor element in `cat m`
do
grep $element t >> r
done

In the solution below, awk rewrites the file just to remove the dashes from the second field so that they can be treated as separate fields by the sort command.
On the first sort key, -k4 would mean field 4 thru end of line, and would mess up the sort if there were more fields on the line. So you need to say "field 4 thru field 4".
The second sort key will sort properly as months.
The third sort key will sort properly as day. -k2 without the "n" would sort alphanumerically with 10 coming before 2.
awk '{gsub("-"," ",$2);print}' myfile |
sort -k4,4 -k3M -k2nIf you need the sorted output in the original format again, you could pipe it through awk again.

Thanks very much for the help cdac and James! I have a further question on a similar problem.
If I have a table of schedules and the fields are:
date activity timestart timeend
And I use awk '/03-feb-2002/' myfile to list my activities for that certain date:
1. how can i sort it so it shows my activities so that the earliest ones show first and then the later ones?
2. how can i make it so that if i supply an argument (let's say a start time), then the result would be all activities starting from that time onwards
3. how can i make it so that if i supply an argument (a range of time) Ex: 10:00am 11:00am (from 10am-11am), then it shows activities falling under there.
Thanks again for any help on this!

Sorry to be such a nag...
but please? anyone?
I need it in less than 24 hours -_-; and I can't make the arrays in awk work so that it will sort. (Can't understand the arrays actually.) =(

So you need a solution how many hours from now?
All 3 scenarios above can be done with a single script that is provided either one, two, or three parameters:
activities 03-feb-2002
activities 03-feb-2002 10:00
activities 03-feb-2002 10:00 11:00You need to post a few lines of actual data because the exact format is important. I would hope that the times are military, but it looks like they might be in 10:00am format.
So I need your time constraint, sample data, and the output of the following:
print a |
awk -v x=$SHELL '{sub("a","b");print x,$1}'

I still do need it because we passed an almost non-functioning project and thinking of passing another one (late, but maybe we can at least get something to work -_-;).
Actually, all three scenarios you mentioned are needed. The user can either input
1. just the date : where the program shows all activities (that's the only thing we've got working, using awk -_-;)2. the date and start time : program shows all activities starting from that time
3. date, start time, end time: program shows all activities within that range
The exact format of the records are
13-feb-2003|1:00a|2:00p|activity
where $1 - date
2 - start time (a indicates A.M.)
3 - end time (p indicates P.M.)
4 - activity nameThanks so much...
We tried everything from putting the records into arrays (we had a problem outputting the contents), from using awk to display it (but it wouldnt take the argument if($2==$*) (so that it would take the date inputted by the user), etc.

I will start coding. In the meantime:
1. Show me the output of:
print a |
awk -v x=$SHELL '{sub("a","b");print x,$1}'2. If start-time and stop-time are provided as parameters, do you want to see all entries that have a start time in that range OR all entries that span that range? For example, if you have:
2:00p 4:00p activity1
4:00p 6:00p activity2
6:00p 8:00p activity3and you request a range of 3:00p thru 5:00p,
only activity2 has a start time in that range, but activity1 was still occurring in that time span.

I am interested in learning the solution to this.
1. the output I get is :
/usr/bin/ksh b
2.What if I like to see all activities that have a start time or end time within that range.I am just interested to know how you would have solved the problem.
-Anukta

![]() |
![]() |
![]() |

This post is quite old and has been locked from receiving new replies. Please create a new posting instead.
| Ads by Google |