UNIX Help
 
Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
User Name:
Password:
Remember me

The Shed is going Social! Join us on FaceBook and Twitter and chime in on the conversation.

Go Back   Dev Shed ForumsOperating SystemsUNIX Help

Reply
Add This Thread To:
  Del.icio.us   Digg   Google   Spurl   Blink   Furl   Simpy   Y! MyWeb 
Thread Tools Search this Thread Rate Thread Display Modes
 
Unread Dev Shed Forums Sponsor:
  #1  
Old February 23rd, 2003, 07:46 PM
hallian9 hallian9 is offline
Junior Member
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Feb 2003
Posts: 4 hallian9 User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 0
Help needed in the following code!!!!!

Hi,
I need some help in the following question. I am trying to read from a file to create users but am stuck in reading the value in double quotes. Following is the file named myfile.txt I am trying to read and looks like.The values are separated by a single space and the one in double-quotes is a single value as it also contains spaces. One line represents one users information.

alc0010 500 "Aaron Lee Conyers" /home/alc0010 /bin/bash
ama0 2 "Test Al-ome" /ama0028 /usr/bin/bash

The following is the code I am trying to use to read the values from the file line by line

####################################
cat myfile.txt |
while IFS=" " read value1 value2 value3 value4 value5
do
......
###################################

But the value3 is the whole value in double quotes, but the space between just take the first word as the value3 instead of the whole in double quotes. Can any one help me out in how to solve this problem and what if there is more than one space between the values. I'll really appreciate for the help.
Thanks

Reply With Quote
  #2  
Old February 24th, 2003, 09:40 PM
zakj zakj is offline
Contributing User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Feb 2003
Posts: 52 zakj User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: 38 m 41 sec
Reputation Power: 11
This is not the most elegant solution, but it should work provided each input line conforms to the format of the examples you gave. Pipe your data file through this awk script, and then use IFS=":".
Code:
#!/usr/bin/awk -F\" -f

{
  gsub(" ", ":", $1)
  gsub(" ", ":", $3)
  print $1 $2 $3
}

Reply With Quote
  #3  
Old February 24th, 2003, 09:59 PM
AlCapone's Avatar
AlCapone AlCapone is offline
Mobbing Gangster
Dev Shed Demi-God (4500 - 4999 posts)
 
Join Date: Sep 2001
Location: "Best City" 2002 and 2003- Melbourne, Australia
Posts: 4,912 AlCapone User rank is Sergeant (500 - 2000 Reputation Level)AlCapone User rank is Sergeant (500 - 2000 Reputation Level)AlCapone User rank is Sergeant (500 - 2000 Reputation Level)AlCapone User rank is Sergeant (500 - 2000 Reputation Level)AlCapone User rank is Sergeant (500 - 2000 Reputation Level) 
Time spent in forums: 5 h 36 m 31 sec
Reputation Power: 31
Send a message via ICQ to AlCapone Send a message via AIM to AlCapone Send a message via Yahoo to AlCapone
or this
cat myfile.txt | perl -n -e '/([\d\w]+) (\d+) "(.*?)" (.[^ ]+?) (.*)/; print $3,$/;'
__________________
And you know I mean that.

Reply With Quote
  #4  
Old February 25th, 2003, 08:18 AM
zakj zakj is offline
Contributing User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Feb 2003
Posts: 52 zakj User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: 38 m 41 sec
Reputation Power: 11
Let the war of escalation begin! Here is a C program which can handle quoted fields in any position; change the definition of DELIM to set the output delimiter.
Code:
#include <sys/types.h>
#include <sys/uio.h>
#include <stdio.h>
#include <unistd.h>

#define DELIM ':'
#define BUFFER 1024

int main(void)
{
  int i, insize, offset, quoted;
  char in[BUFFER], out[BUFFER];

  quoted = 0;

  while ((insize = read(0, in, BUFFER)) > 0) {
    offset = 0;
    for (i = 0; i < insize; ++i) {
      if (quoted) {
        if (in[i] == '"') {
          quoted = 0;
          --offset;
          continue;
        }
      }
      else {
        if (in[i] == '"') {
          quoted = 1;
          --offset;
          continue;
        }
        if (in[i] == ' ')
          in[i] = DELIM;
      }
      out[i - offset] = in[i];
    }
    write(1, out, insize - offset);
  }

  return 0;
}

Reply With Quote
Reply

Viewing: Dev Shed ForumsOperating SystemsUNIX Help > Help needed in the following code!!!!!

Developer Shed Advertisers and Affiliates



Thread Tools  Search this Thread 
Search this Thread:

Advanced Search
Display Modes  Rate This Thread 
Rate This Thread:


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
View Your Warnings | New Posts | Latest News | Latest Threads | Shoutbox
Forum Jump

Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
  
 


Powered by: vBulletin Version 3.0.5
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.

© 2003-2013 by Developer Shed. All rights reserved. DS Cluster - Follow our Sitemap