Sorting mail files chronologically on Unix
Taed Nelson
nelson at berlioz.nsc.com
Thu May 2 10:45:56 AEST 1991
>>If someone actually goes to the trouble to develop such a program, I'm
>>sure that they'd find a large number of people who'd be interested in it.
Some kind soul sent me this script a while back when I asked the same
question. If the name is not in the comments, then I don't know who wrote
it. It is included below.
It is followed by an AWK script which I wrote (borrowing from the
aformentioned program) to delete any pieces of mail which have a Subject which
starts with the character `@'. The reason I have this is because I save all
of my outgoing mail in a record, but sometimes I send out junk that I don't
want wasting space in my record. By putting an `@', I allow that mail to be
deleted when I run the script under AWK.
SORT MAIL:
------------------------------------------------------------------------------
#!/bin/sh
#
# sort mail in a folder chronologically
#
# From unido!uunet!amdahl!rtech!llama!daveb Thu Jan 28 09:00:34 1988
# Received: by fb10vax.sbsvax.uucp; Thu, 28 Jan 88 09:00:32 +0100 (MET)
# Date: Wed, 27 Jan 88 16:54:52 pst
# From: unido!uunet!amdahl!rtech!llama!daveb (Dave Brower)
new=sorted.$$
myname=`basename $0`
case $MAILSORT in # assume MAILSORT is an env. variable
-v)
RMFLAG='-i'
;;
*)
RMFLAG='-f'
trap 'rm -f $new ; exit' 0 1 2 3 5 9
;;
esac
case $# in
'')
echo -n "Name the mail folder to sort: "
read old
;;
1)
old=$1
;;
*)
echo "Usage: $myname old"
exit
;;
esac
if [ ! -f $old ]
then
echo "$old: no such file"
exit
elif [ ! -w $old ]
then
echo "$old: no write access"
exit
fi
awk '
BEGIN {
month["Jan"] = 1
month["Feb"] = 2
month["Mar"] = 3
month["Apr"] = 4
month["May"] = 5
month["Jun"] = 6
month["Jul"] = 7
month["Aug"] = 8
month["Sep"] = 9
month["Oct"] = 10
month["Nov"] = 11
month["Dec"] = 12
}
/^From / {
++msg
if( NF == 7)
hold = sprintf("%s:%02d:%02d:%s %d", $7, month[$4], $5, $6, msg)
# if( getline && NF == 7 && $1 == "Date:")
# hold = sprintf( "19%s:%02d:%02d:%s %d", $5, month[$4], $3, $6, msg)
print hold
}
' $old | sort -n | sed "s/.* \(.*\)/s \1 $new/" | mail -f $old > /dev/null
if [ $? = 0 ]
then
mv $RMFLAG $new $old
echo "$old is now sorted"
else
echo "Problems sorting $old, left untouched"
fi
------------------------------------------------------------------------------
KILL MAIL:
------------------------------------------------------------------------------
# The AWK script which deletes all mail on stdin with the first subject
# character as `@'.
# Written April 1991 by Taed Nelson (nelson at desktop.nsc.com)
# Place the message or the packet record in the appropriate file.
function sortMessage() {
if ((saveMode != KILL) && (saveMode != NONE)) {
# Don't use "i in messageStore" since it doesn't keep the order
# Also, get rid of trailing blanks since I hate them
for (i=1; i <= (numLines - trailingBlanks); i++) {
print messageStore[i];
delete messageStore[i];
}
# Make sure there's a newline between the records
printf ("\n");
}
}
BEGIN {
numLines = 0;
NONE = 0;
KILL = 1;
MESSAGE = 2;
UNKNOWN = 3;
# So that we don't have any output if there are only kill messages
saveMode = NONE;
}
# The "From" line contains the date we received the message.
# It better be the first line, or it's going to get confused.
($1 == "From") && (NF == 7) {
sortMessage();
saveMode = UNKNOWN;
numLines = 0;
++messageNum;
}
# If we know we're collecting a kill or the whitespace between messages,
# we can skip to the next message.
(saveMode == KILL) || (saveMode == NONE) {
next;
}
# Always collect the text of the messages.
{
messageStore[++numLines] = $0;
if ((saveMode == UNKNOWN) && ($1 ~ /^Subject:$/)) {
if ($2 ~ /^\@/) {
saveMode = KILL;
}
else {
saveMode = MESSAGE;
}
}
if ($0 ~ /^$/) {
trailingBlanks++;
}
else {
trailingBlanks= 0;
}
}
# Don't forget to sort the last message!
END {
sortMessage();
}
More information about the Comp.unix.questions
mailing list