#1
  1. No Profile Picture
    Junior Member
    Devshed Newbie (0 - 499 posts)

    Join Date
    Feb 2003
    Posts
    4
    Rep 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
  2. #2
  3. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Feb 2003
    Posts
    52
    Rep Power
    12
    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
    }
  4. #3
  5. Mobbing Gangster
    Devshed Demi-God (4500 - 4999 posts)

    Join Date
    Sep 2001
    Location
    "Best City" 2002 and 2003- Melbourne, Australia
    Posts
    4,912
    Rep Power
    32
    or this
    cat myfile.txt | perl -n -e '/([\d\w]+) (\d+) "(.*?)" (.[^ ]+?) (.*)/; print $3,$/;'
    And you know I mean that.
  6. #4
  7. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Feb 2003
    Posts
    52
    Rep Power
    12
    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;
    }

IMN logo majestic logo threadwatch logo seochat tools logo