|
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.
|
|
|
|
|