separating data from a file. 
Author Message
 separating data from a file.

Hi All,

   I am very much new to awk. Your suggestion will be highly
appreciated.

   I have a data file like this :

                  C(  1) 2s         C(  1) 2px         C(  1) 2py    
                   0.2873             0.0000             0.0051
                   0.0000             0.1125             0.0000
                  -0.4455             0.0000            -0.0016
                   0.3622             0.0000            -0.1246
                   0.0000             0.2935             0.0000

                  C(  1) 2pz          C(  2) 2s         C(  2) 2px
                   0.0000             0.2873             0.0044
                   0.0000            -0.3858             0.0269
                   0.0000            -0.2227            -0.0494
                   0.0000            -0.1811             0.1811
                   0.0000            -0.3137             0.0201

                 C(  2) 2py         C(  2) 2pz          C(  3) 2s    
                   0.0026             0.0000             0.2873
                  -0.0494             0.0000             0.3858
                   0.0840             0.0000            -0.2227
                  -0.1889             0.0000            -0.1811
                   0.1811             0.0000             0.3137

                  C(  3) 2px         C(  3) 2py         C(  3) 2pz
                  -0.0044             0.0026             0.0000
                   0.0269             0.0494             0.0000
                   0.0494             0.0840             0.0000
                  -0.1811            -0.1889             0.0000
                   0.0201            -0.1811             0.0000

    I want to put all the C( i)2S ,C( i)2px, C( i)2py, C( i)pz in
different columns. So finally I want a four column data point with the
above mentioned
headings.

    Please help.

  Raj Kumar Gupta
  Bangalore
  India.



Sun, 13 Feb 2005 23:24:55 GMT  
 separating data from a file.

Quote:
> Hi All,

>    I am very much new to awk. Your suggestion will be highly
> appreciated.

>    I have a data file like this :

>                   C(  1) 2s         C(  1) 2px         C(  1) 2py
>                    0.2873             0.0000             0.0051
>                    0.0000             0.1125             0.0000
>                   -0.4455             0.0000            -0.0016
>                    0.3622             0.0000            -0.1246
>                    0.0000             0.2935             0.0000

>                   C(  1) 2pz          C(  2) 2s         C(  2) 2px
>                    0.0000             0.2873             0.0044
>                    0.0000            -0.3858             0.0269
>                    0.0000            -0.2227            -0.0494
>                    0.0000            -0.1811             0.1811
>                    0.0000            -0.3137             0.0201

>                  C(  2) 2py         C(  2) 2pz          C(  3) 2s
>                    0.0026             0.0000             0.2873
>                   -0.0494             0.0000             0.3858
>                    0.0840             0.0000            -0.2227
>                   -0.1889             0.0000            -0.1811
>                    0.1811             0.0000             0.3137

>                   C(  3) 2px         C(  3) 2py         C(  3) 2pz
>                   -0.0044             0.0026             0.0000
>                    0.0269             0.0494             0.0000
>                    0.0494             0.0840             0.0000
>                   -0.1811            -0.1889             0.0000
>                    0.0201            -0.1811             0.0000

>     I want to put all the C( i)2S ,C( i)2px, C( i)2py, C( i)pz in
> different columns. So finally I want a four column data point with the
> above mentioned
> headings.

>     Please help.

>   Raj Kumar Gupta
>   Bangalore
>   India.

Raj -

This is pretty hellacious AWK, you need to be able to follow the use of
arrays and know SUBSEP to understand it.  Also, realize that simply
referencing an array element makes an entry that can be used for an "in"
test.

Also, I noticed that your C(i)2pz data was all zeros, so I mangled your
C(2)2pz data.

I made allowances for the fact that you might have more than just "C" in
C()...,
and more than just the "2s,2px,2py,2pz" values.  I did not handle the case
where you might end up with "1s,1px,1py,1pz" or some other preceeding
sequence number before "s,px,py,pz".

I used gawk 3.1.0 on Win98.

If this is useful, will your company ask me to come to Bangalore for a few
weeks to help out? :)

    - Dan

recolumn.awk
----------
    /[A-Z]\(/ {

        # A row like "C(  2) 2s"
        # series------^
        # cycle---------^^^
        # colName-----------^^^

        line = $0
        gsub(/[A-Z]\(/,"|&", line)
        n = split(line,heading,"|")
        for (i = 2; i <= n; i++) {
            hdr = heading[i]
            col = i - 1

            ser = series[col] = substr(hdr,1,1)
            if (!(ser in seriesListValues)) {
                seriesList[++seriesCount] = ser
                seriesListValues[ser]
            }

            match(hdr,/\(.*\)/)
            cyl = cycle[col] = substr(hdr,RSTART+1,RLENGTH-2)
            ser_cyl = ser SUBSEP cyl
            if (!(ser_cyl in cycleListValues)) {
                cycleList[ser,++cycleCount[ser]] = cyl
                cycleListValues[ser_cyl]
            }

            cn = substr(hdr,RSTART+RLENGTH)
            gsub(/ +/,"",cn)
            colName[col] = cn
            ser_cn = ser SUBSEP cn
            if (!(ser_cn in colNameListValues)) {
                colNameList[ser,++colNameCount[ser]] = cn
                colNameListValues[ser_cn]
            }
        }
        next
    }

    NF {
        # Right now, we don't try to handle the
        # case where some columns are blank, because,
        # for instance, C(3) could have one more row than C(2)
        # (in the posted data, 3rd set of rows).
        for (i = 1; i <= NF; i++) {
            rc = ++rowCount[ser=series[i], cyl=cycle[i], cn=colName[i]]
            if (rc > rowCount[ser,cyl]) rowCount[ser,cyl]= rc
            data[ser,cyl,cn,rc] = $i
        }
    }

    END {
        for (ser_x = 1; ser_x <= seriesCount; ser_x++) {
            ser = seriesList[ser_x]
            print "Series " ser

            for (cyl_x = 1; cyl_x <= cycleCount[ser]; cyl_x++) {
                cyl = cycleList[ser,cyl_x]

                printf "\n"
                for (cn_x = 1; cn_x <= colNameCount[ser]; cn_x++) {
                    cn = colNameList[ser,cn_x]
                    printf "%11s(%3d)%3s", ser, cyl, cn
                }

                printf "\n"
                for (row_x = 1; row_x <= rowCount[ser,cyl]; row_x++) {
                    for (cn_x = 1; cn_x <= colNameCount[ser]; cn_x++) {
                        cn = colNameList[ser,cn_x]
                        printf "%16.4f%3s", data[ser,cyl,cn,row_x], ""
                    }
                    printf "\n"
                }
            }
        }
    }

data
----------
                  C(  1) 2s         C(  1) 2px         C(  1) 2py
                   0.2873             0.0000             0.0051
                   0.0000             0.1125             0.0000
                  -0.4455             0.0000            -0.0016
                   0.3622             0.0000            -0.1246
                   0.0000             0.2935             0.0000

                  C(  1) 2pz          C(  2) 2s         C(  2) 2px
                   0.0000             0.2873             0.0044
                   0.0000            -0.3858             0.0269
                   0.0000            -0.2227            -0.0494
                   0.0000            -0.1811             0.1811
                   0.0000            -0.3137             0.0201

                 C(  2) 2py         C(  2) 2pz          C(  3) 2s
                   0.0026             0.1000             0.2873
                  -0.0494             0.0200             0.3858
                   0.0840             0.0030            -0.2227
                  -0.1889             0.0004            -0.1811
                   0.1811             0.0050             0.3137

                  C(  3) 2px         C(  3) 2py         C(  3) 2pz
                  -0.0044             0.0026             0.0000
                   0.0269             0.0494             0.0000
                   0.0494             0.0840             0.0000
                  -0.1811            -0.1889             0.0000
                   0.0201            -0.1811             0.0000

(output)
(If this double-spaces, or worse, it is an artifact of my newsreader.)
----------

Quote:
>awk -f recolumn.awk data

Series C

          C(  1) 2s          C(  1)2px          C(  1)2py          C(  1)2pz
          0.2873             0.0000             0.0051             0.0000
          0.0000             0.1125             0.0000             0.0000
         -0.4455             0.0000            -0.0016             0.0000
          0.3622             0.0000            -0.1246             0.0000
          0.0000             0.2935             0.0000             0.0000

          C(  2) 2s          C(  2)2px          C(  2)2py          C(  2)2pz
          0.2873             0.0044             0.0026             0.1000
         -0.3858             0.0269            -0.0494             0.0200
         -0.2227            -0.0494             0.0840             0.0030
         -0.1811             0.1811            -0.1889             0.0004
         -0.3137             0.0201             0.1811             0.0050

          C(  3) 2s          C(  3)2px          C(  3)2py          C(  3)2pz
          0.2873            -0.0044             0.0026             0.0000
          0.3858             0.0269             0.0494             0.0000
         -0.2227             0.0494             0.0840             0.0000
         -0.1811            -0.1811            -0.1889             0.0000
          0.3137             0.0201            -0.1811             0.0000



Mon, 14 Feb 2005 15:45:48 GMT  
 separating data from a file.
Its great Dan. It is doing the job.
Thanks a lot.

I will be happy to host you here but I am a project student here in
Bangalore. I myself is a guest. But if you need any other information

Thanks and best regards.

 Raj

Quote:

> Hi All,

>    I am very much new to awk. Your suggestion will be highly
> appreciated.

>    I have a data file like this :

>                   C(  1) 2s         C(  1) 2px         C(  1) 2py    
>                    0.2873             0.0000             0.0051
>                    0.0000             0.1125             0.0000
>                   -0.4455             0.0000            -0.0016
>                    0.3622             0.0000            -0.1246
>                    0.0000             0.2935             0.0000

>                   C(  1) 2pz          C(  2) 2s         C(  2) 2px
>                    0.0000             0.2873             0.0044
>                    0.0000            -0.3858             0.0269
>                    0.0000            -0.2227            -0.0494
>                    0.0000            -0.1811             0.1811
>                    0.0000            -0.3137             0.0201

>                  C(  2) 2py         C(  2) 2pz          C(  3) 2s    
>                    0.0026             0.0000             0.2873
>                   -0.0494             0.0000             0.3858
>                    0.0840             0.0000            -0.2227
>                   -0.1889             0.0000            -0.1811
>                    0.1811             0.0000             0.3137

>                   C(  3) 2px         C(  3) 2py         C(  3) 2pz
>                   -0.0044             0.0026             0.0000
>                    0.0269             0.0494             0.0000
>                    0.0494             0.0840             0.0000
>                   -0.1811            -0.1889             0.0000
>                    0.0201            -0.1811             0.0000

>     I want to put all the C( i)2S ,C( i)2px, C( i)2py, C( i)pz in
> different columns. So finally I want a four column data point with the
> above mentioned
> headings.

>     Please help.

>   Raj Kumar Gupta
>   Bangalore
>   India.



Tue, 15 Feb 2005 14:15:10 GMT  
 separating data from a file.
Quote:


...
>>    I want to put all the C( i)2S ,C( i)2px, C( i)2py, C( i)pz in
>>different columns. So finally I want a four column data point with the
>>above mentioned
>>headings.
...
>This is pretty hellacious AWK, you need to be able to follow the use of
>arrays and know SUBSEP to understand it.  Also, realize that simply
>referencing an array element makes an entry that can be used for an "in"
>test.

...

Hellacious awk code is often an indicator that awk may not be the ideal tool
to use. In this case, the problem is that there are multiple observations(?)
of 3 data points along 4 axes (or 3 axes parameterized by something else) in
the data file, so 4 'columns' per point but only 3 'columns' of data appear
on
each line. It looks like there's regular wrap-around, so write each group of
nonblank rows to a separate file, paste them together horizontally in order,
then cut groups of 4 'columns' into separate files. It could all be done
with
a shell script using nothing more than cut(1) and paste(1).

But this is an awk ng, so time for an alternative awk script that assumes
the
data layout I mention above. It's only bell is that NumCol (defaulting to
the
OP's requirement of 4) may be set on the command line, and it governs how
many columns appear per point. It isn't short, but it requires no
field-level
text mangling.

# begin unfold.awk
BEGIN {
  FS = "[ \t][ \t][ \t]+"
  if (NumCol == "") NumCol = 4

Quote:
}

/[^ \t]/ {
  ++n

  p = ($1 == "")
  q = NF - p - ($NF == "")

  for (i = 1; i <= q; ++i)
    d[n, c + i] = ((n == 1) ? $(i + p) : sprintf("%8.4f", $(i + p)))

  if (n > nmax) nmax = n
  if (q > qmax) qmax = q

  next

Quote:
}

n && /^[ \t]*$/ {
  n = 0
  c += qmax

Quote:
}

END {
  if (n) c += qmax

  for (k = 0; k < c; k += NumCol) {
    for (n = 1; n <= nmax; ++n) {
      for (j = 1; j <= NumCol; ++j) {
        printf("%-12s%s", d[n, j + k], ((j < NumCol) ? "  " : "\n"))
      }
    }
    printf("\n\n")
  }

Quote:
}

# end unfold.awk


Wed, 16 Feb 2005 02:15:15 GMT  
 
 [ 4 post ] 

 Relevant Pages 

1. collecting colon-separated data files into lists

2. newbie would like to break input file and output to separate files

3. Separate Verilog files or one big file?

4. Read VFP data files into Clipper data files

5. I have 100 data files, I want to join them together as one data file

6. Unix Data files vs DOS data files

7. non-gridded ASCII data file to netCDF data file

8. Separating data using PCI 6204E DAQ PC Card.

9. Modern forths with separate data, code, headers

10. Share Global Variables data between two separate programs in one machine

11. Global variables to share data between separate programs.

12. Separating Data Generation and Display

 

 
Powered by phpBB® Forum Software