Unix Shell - Access 1st 12 charectors of a word.

This is Interesting: Free IT Magazines  
Home > Archive > Unix Shell > August 2006 > Access 1st 12 charectors of a word.





You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

Author Access 1st 12 charectors of a word.
Dave Kelly

2006-08-22, 1:38 am

I have a list that is 3 words to each line.
I know how to read the file.
I need only the first 12 character of the 3 word. This word is not
guaranteed to be 12 character long. This is where I'm stuck.

Is there an equivalent to the old basic 'left$'? Where do I find it?

What do I search Google for?

TIA Dave
Xicheng Jia

2006-08-22, 1:38 am

Dave Kelly wrote:
> I have a list that is 3 words to each line.
> I know how to read the file.
> I need only the first 12 character of the 3 word. This word is not
> guaranteed to be 12 character long. This is where I'm stuck.
>
> Is there an equivalent to the old basic 'left$'? Where do I find it?
>


cut -c-12

--
Xicheng

Chris F.A. Johnson

2006-08-22, 1:38 am

On 2006-08-22, Dave Kelly wrote:
> I have a list that is 3 words to each line.
> I know how to read the file.
> I need only the first 12 character of the 3 word. This word is not
> guaranteed to be 12 character long. This is where I'm stuck.
>
> Is there an equivalent to the old basic 'left$'? Where do I find it?


To get the first 12 characters of the third word of every line:

awk '{ printf "%s\n", substr($3,1,12) }'

If you only want lines where the thrid word contains at least 12
letters:

awk 'length($3) >=12 { printf "%s\n", substr($3,1,12) }'

If you want to process it in the shell:

word=qwertyuiopasdfghjklzxcvbnm
mask=????????????
junk=${word#$mask}
printf "%s\n" "${word%"$junk"}"

In bash or ksh93:

printf "%s\n" "${word:0:12}"

For other POSIX shells, there is a substr() function in my book
that can do it. (I may previously have posted it here. All the
scripts from the book are available on line.)

--
Chris F.A. Johnson, author <http://cfaj.freeshell.org>
Shell Scripting Recipes: A Problem-Solution Approach (2005, Apress)
===== My code in this post, if any, assumes the POSIX locale
===== and is released under the GNU General Public Licence
Ed Morton

2006-08-22, 1:38 am

Chris F.A. Johnson wrote:
> On 2006-08-22, Dave Kelly wrote:
>
>
>
> To get the first 12 characters of the third word of every line:
>
> awk '{ printf "%s\n", substr($3,1,12) }'
>


Actually, that'll print the first 12 characters of the 3rd string of
non-blanks. For the OP - what's a "word"? For example, in this context:

Bob says "Hi!".

is <"Hi!".> a word, or <"Hi!">, or <Hi!> or <Hi> or something else?

Ed
Chris F.A. Johnson

2006-08-22, 1:38 am

On 2006-08-22, Ed Morton wrote:
> Chris F.A. Johnson wrote:
>
> Actually, that'll print the first 12 characters of the 3rd string of
> non-blanks. For the OP - what's a "word"? For example, in this context:
>
> Bob says "Hi!".
>
> is <"Hi!".> a word, or <"Hi!">, or <Hi!> or <Hi> or something else?


Very true, but the OP did say there were 3 words per line. whatever
a word is.

--
Chris F.A. Johnson, author <http://cfaj.freeshell.org>
Shell Scripting Recipes: A Problem-Solution Approach (2005, Apress)
===== My code in this post, if any, assumes the POSIX locale
===== and is released under the GNU General Public Licence
Ed Morton

2006-08-22, 1:38 am

Chris F.A. Johnson wrote:
> On 2006-08-22, Ed Morton wrote:
>
>
>
> Very true, but the OP did say there were 3 words per line. whatever
> a word is.
>


Right, but he didn't say if "words" were strictly space-separated (e.g.
is "space-separated" one word or 2 to the OP?).

Ed.
Xicheng Jia

2006-08-22, 1:38 am


Ed Morton wrote:
> Chris F.A. Johnson wrote:
>
> Actually, that'll print the first 12 characters of the 3rd string of
> non-blanks. For the OP - what's a "word"? For example, in this context:
>
> Bob says "Hi!".
>
> is <"Hi!".> a word, or <"Hi!">, or <Hi!> or <Hi> or something else?


No big deal, just trim all non-word with one more pipeline or y|tr
commands.

--
XC

Dave Kelly

2006-08-22, 1:38 am

Dave Kelly wrote:
> I have a list that is 3 words to each line.
> I know how to read the file.
> I need only the first 12 character of the 3 word. This word is not
> guaranteed to be 12 character long. This is where I'm stuck.
>
> Is there an equivalent to the old basic 'left$'? Where do I find it?
>
> What do I search Google for?
>
> TIA Dave


I did not provide enough information. My apologies.

I am developing a protected directory on my web server. This directory
will contain a membership list. If you are on the membership list you
can download the membership list.

I want the user name to be the first name and last name with no spaces
in between the 2 words. The password will be the format of the 1st 12
characters of the email address.

The membership is put together with excel, sent to me as a cvs file and
takes the form:

Kelly,Dave,10371 Renfaire
Drive,Plantersville,TX,77363,(936)xxx-1xx0,,,1/30/2001
0:00,daveekelly@xxxxxxxxx.net,R,6/30/2005 0:00,2005-2006,,

code I had started:

#!/bin/bash


main()
{
IFS=, ; while read "LastName" "FirstName" "Address" "City" "State" \
"ZipCode" "HomePh" "BusinessPh" "tmp" "DateJoined" "email" \
"MembershipType" "RenewalDate" "MembershipYear" "Paid" "Notes";

do make_list "$LastName" "$FirstName" "$email" ; done
}
make_list()
{
Email=cut -c12 "$email";
echo >> "$firstname""$lastname","$Email"
}
main

Im currently chasing this error "./pdlist.sh: line 14: -c12: command not
found"
Jon LaBadie

2006-08-22, 1:38 am

Dave Kelly wrote:
> Dave Kelly wrote:
>
> I did not provide enough information. My apologies.
>
> I am developing a protected directory on my web server. This directory
> will contain a membership list. If you are on the membership list you
> can download the membership list.
>
> I want the user name to be the first name and last name with no spaces
> in between the 2 words. The password will be the format of the 1st 12
> characters of the email address.
>
> The membership is put together with excel, sent to me as a cvs file and
> takes the form:
>
> Kelly,Dave,10371 Renfaire
> Drive,Plantersville,TX,77363,(936)xxx-1xx0,,,1/30/2001
> 0:00,daveekelly@xxxxxxxxx.net,R,6/30/2005 0:00,2005-2006,,
>
> code I had started:
>
> #!/bin/bash
>
>
> main()
> {
> IFS=, ; while read "LastName" "FirstName" "Address" "City" "State" \
> "ZipCode" "HomePh" "BusinessPh" "tmp" "DateJoined" "email" \
> "MembershipType" "RenewalDate" "MembershipYear" "Paid" "Notes";
>
> do make_list "$LastName" "$FirstName" "$email" ; done
> }
> make_list()
> {
> Email=cut -c12 "$email";
> echo >> "$firstname""$lastname","$Email"
> }
> main
>
> Im currently chasing this error "./pdlist.sh: line 14: -c12: command not
> found"


Email=$(echo "$email" | cut -c12)

Dave Kelly

2006-08-22, 1:38 am

Dave Kelly wrote:
> I have a list that is 3 words to each line.
> I know how to read the file.
> I need only the first 12 character of the 3 word. This word is not
> guaranteed to be 12 character long. This is where I'm stuck.
>
> Is there an equivalent to the old basic 'left$'? Where do I find it?
>
> What do I search Google for?
>
> TIA Dave

Works great, Thanks guys.

This command line:

../pdlist.sh < TFF-Membership-8-19-06.csv > pdlist

#!/bin/bash


main()
{
IFS=, ; while read "LastName" "FirstName" "Address" "City" "State" \
"ZipCode" "HomePh" "BusinessPh" "tmp" "DateJoined" "email" \
"MembershipType" "RenewalDate" "MembershipYear" "Paid" "Notes";

do make_list "$LastName" "$FirstName" "$email" ; done
}
make_list()
{
lastname=$1;
firstname=$2;
email=$3;

Email=$(echo "$email" | cut -c-12)
echo "$firstname$lastname",$Email;
}
main

produced my own entry in the list as such.
Exactly what I wanted.


DaveKelly,daveekelly@e

again, Thanks
Dave

Stephane Chazelas

2006-08-22, 7:31 am

On Mon, 21 Aug 2006 21:59:16 -0400, Chris F.A. Johnson wrote:
[...]
> In bash or ksh93:
>
> printf "%s\n" "${word:0:12}"


And in zsh: $word[1,12]

> For other POSIX shells, there is a substr() function in my book
> that can do it. (I may previously have posted it here. All the
> scripts from the book are available on line.)


There's a substr function in awk, and there's expr.

awk 'BEGIN{print substr(ARGV[1], 1, 12); exit}' "$word"
expr "x$word" 'x\(.\{0,12\}\)'


--
Stephane
Stephan 'smg' Grein

2006-08-22, 7:31 am

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Dave Kelly wrote:
> I have a list that is 3 words to each line.
> I know how to read the file.
> I need only the first 12 character of the 3 word. This word is not
> guaranteed to be 12 character long. This is where I'm stuck.
>
> Is there an equivalent to the old basic 'left$'? Where do I find it?
>
> What do I search Google for?
>
> TIA Dave

Maybe you try this:
- --- your code ---
and then:
for string in list;
do echo ${string:0:12} # works for bash
done


b.r.,
- --
Stephan 'smg' Grein, <stephan at stephan minus rockt dot de>
http://stephangrein.de
GnuPG-Key-ID: 0xF8C275D4
FingerPrint: 5B6F 134A 189B A24D 342B 0961 8D4B 0230 F8C2 75D4
Geek by nature, Linux by choice.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)

iQIVAwUBROrMyo1LAjD4wnXUAQLElQ/+J4KINCgnaeIVWyeRVWcqdXM47lUOQPj8
EVRa9hvR96ve1l5xC7/ o5q4+5agECp274P2S0ay+j6bAMO9NdTrTN5hRiOe
5eb9n
zpAsQ3FRzbvSBFDv8ks0XeLxcy65JLfIzWUS+nom
rrTJHw6o2EBna7O/yQTNQIPy
TJgHpwRTKtPBPFU0GNs+Lbqf9JIz4MJv3UDki5rt
7Cm/YVxoKXo2OTpVWRR4ulOU
KvJ/RJ1P11F7il7YxF4zT4IpkuVO71bdrPQJcHyKUC/R5SAqh0Wfv9O3SSoLTFu9
UWvRFdKenc68M9Ii/ paltbyVgOdFqSWjJ518dQLytzZbbpEpeW6RHxkiG
uyTVTXM
IZ+ZQP5rgCSkktuDff4dLfN74J+Kd2RVsmrdW/ouzdJRCFVJmRanOtaDK288Y2qb
iuyyLw6gaK4N6iwlb3EzFUplrNdjOsFY1NPwdskU
abDhgDM+qTkBAJaz/DD+i00o
FRNL0uV1/Fts+LL7CUPZnrPPY/4UMnQEJfYnAh7z3xXHI30z8NI3Rk4+DEw42BjM
A/K/ dI11WbGth0QGqM3Cf3g8unuJXMyjePrqEsdN5Md3
E4jnvjBGEeForqu5Ehvy
6szPlpbKUzK85jBjGVIY84JvyXjgzO/gteq28QU1/Y/c50Xai9iLvNYQQrUCSmgj
SRooj4A+FAo=
=G0ER
-----END PGP SIGNATURE-----
Ed Morton

2006-08-22, 7:31 am

Dave Kelly wrote:
> Dave Kelly wrote:
>
>
> Works great, Thanks guys.
>
> This command line:
>
> ./pdlist.sh < TFF-Membership-8-19-06.csv > pdlist
>
> #!/bin/bash
>
>
> main()
> {
> IFS=, ; while read "LastName" "FirstName" "Address" "City" "State" \
> "ZipCode" "HomePh" "BusinessPh" "tmp" "DateJoined" "email" \
> "MembershipType" "RenewalDate" "MembershipYear" "Paid" "Notes";
>
> do make_list "$LastName" "$FirstName" "$email" ; done
> }
> make_list()
> {
> lastname=$1;
> firstname=$2;
> email=$3;
>
> Email=$(echo "$email" | cut -c-12)
> echo "$firstname$lastname",$Email;
> }
> main
>
> produced my own entry in the list as such.
> Exactly what I wanted.
>
>
> DaveKelly,daveekelly@e
>
> again, Thanks
> Dave
>


awk -F, '{ printf "%s%s,%s\n", $1,$2,substr($3,1,12) }' <
TFF-Membership-8-19-06.csv > pdlist

would do the same.

Ed.
Dave Kelly

2006-08-22, 1:21 pm

Ed Morton wrote:
> Dave Kelly wrote:
>
> awk -F, '{ printf "%s%s,%s\n", $1,$2,substr($3,1,12) }' <
> TFF-Membership-8-19-06.csv > pdlist
>
> would do the same.
>
> Ed.

Wouldn't that give me 'LastNameFirstName,Address' instead of
'FirstNameLastName,email'?

Would 'substr($10,1,12)' get me email?

Thanks for the feedback.
Dave
Ed Morton

2006-08-22, 1:21 pm

Dave Kelly wrote:
> Ed Morton wrote:
>
>
> Wouldn't that give me 'LastNameFirstName,Address' instead of
> 'FirstNameLastName,email'?
>

Yes. Switch $1 and $2 and replace $3 by $11.

> Would 'substr($10,1,12)' get me email?


Looks to me like it'd be $11.

Ed.
Sponsored Links






Free braindumps | Software forum | Database administration forum

Copyright 2003 - 2009 webservertalk.com