Visit Our UNIX and Linux User Community


Output formatting


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Output formatting
# 1  
Old 02-11-2011
Output formatting

I have input file in this way


Code:
John   1234   BASIC       26000 
John   1234   ALLOWC      01550
John   1234   INCER       01700
John   1234   REL         20000
Debi   2345   BASIC       29000
Debi   2345   ALLOWC      01600
Debi   2345   INCR        01900
Debi   2345   REL         21000
Rob    3456   BASIC       15000
Rob    3456   REL         01500

The output require is in the fowllowing format
Code:
Name   EMP     BASIC     ALLOWC     INCER     REL
John    1234   26000     01550      01700      20000
Debi    2345   29000     01600      01900      21000
Rob     3456   15000      --         --        01500

Here some employee may have joined newly so may not get all the perq.
That thas to be left blank .
Had it been equal numbers of lines for each employee then we can use the command paste .

Thanks in advance
Vakharia M JSmilie
# 2  
Old 02-11-2011
Try...
Code:
$ cat file1
John   1234   BASIC       26000
John   1234   ALLOWC      01550
John   1234   INCER       01700
John   1234   REL         20000
Debi   2345   BASIC       29000
Debi   2345   ALLOWC      01600
Debi   2345   INCR        01900
Debi   2345   REL         21000
Rob    3456   BASIC       15000
Rob    3456   REL         01500

$ awk ' { d[$2, $3] = $4 }
      ! ($2 in k) { k[$2] = $1 ; h[++c] = $2 }
      ! ($3 in j) { j[$3] = 1 ; i[++m] = $3 }
      ! d["", $3] { d["", $3] = $3 }
      END {
            for (x = 0; x <= c; x++) {
                  z = h[x]
                  printf "%s%s%s%s", k[z], OFS, z, OFS
                  for (y = 1; y <= m; y++) {
                        w = i[y]
                        printf "%s%s", d[z, w], (y == m ? ORS : OFS)
                  }
            }
      }
    ' OFS="\t" file1 > file2

$ cat file2
                BASIC   ALLOWC  INCER   REL     INCR
John    1234    26000   01550   01700   20000
Debi    2345    29000   01600           21000   01900
Rob     3456    15000                   01500

$

This User Gave Thanks to Ygor For This Post:
# 3  
Old 02-11-2011
Question

Ygor Thanks lot for your code and it worked,one more thing I have data
for more then 700 employees and when the data of two line and then
four lines and then threee lines , i.e. if the data varies as per the length of serivce , means Seniors have data of 4 lines and new recurits may have 2 lines there it does not give the reqiuied output ,
the red shows the change made to suit my requirement but it failed,
Code:
awk ' { d[$2, $3] = $NF }
      ! ($2 in k) { k[$2] = $1 ; h[++c] = $2 }
      ! ($3 in j) { j[$3] = 1 ; i[++m] = $3 }
      ! d["", $3] { d["", $3] = $3 }
      END {
            for (x = 0; x <= c; x++) {
                  z = h[x]
                  printf "%s%s%s%s", k[z], OFS, z, OFS
                  for (y = 1; y <= m; y++) {
                        w = i[y]
                        printf "%s%s", d[z, w], (y == m ? ORS : OFS)
                  }
            }
      }
    ' OFS="\t" file1 > file2

It works well if the datas are in descending order.
Any suggestion ?? Thanks for your code .
Vakharia M J

Last edited by Scott; 02-11-2011 at 01:42 PM.. Reason: Code tags, please...
# 4  
Old 02-11-2011
See if this code works for what you want:
Code:
#!/usr/bin/ksh
mPrevN="First_Time"
while read mName mEmp mDesc mValue
do
  if [[ "${mName}" != "${mPrevN}" ]]; then
    if [[ "${mPrevN}" = "First_Time" ]]; then
      echo 'Name EMP BASIC ALLOWC INCER REL'
    else
      echo ${mPrevN} ${mPrevE} ${mDBasic} ${mDAllowc} ${mDIncer} ${mDRel}
    fi
    mDBasic='--'
    mDAllowc='--'
    mDIncer='--'
    mDRel='--'
  fi
  case "${mDesc}" in
    "BASIC")  mDBasic=${mValue};;
    "ALLOWC") mDAllowc=${mValue};;
    "INCER")  mDIncer=${mValue};;
    "REL")    mDRel=${mValue};;
    *)  echo '??? Error: No description matched.'
        echo 'mDesc = <'${mDesc}'>';;
  esac
  mPrevN=${mName}
  mPrevE=${mEmp}
done < Input_File
if [[ "${mPrevN}" != "First_Time" ]]; then
  echo ${mPrevN} ${mPrevE} ${mDBasic} ${mDAllowc} ${mDIncer} ${mDRel}
fi

# 5  
Old 02-12-2011
Code:
awk '{a[$1 FS $3]=$4; b[$3];c[$1]=$2} 
END {   printf "Name\tEMP\t";for (i in b) printf i OFS;printf RS; 
        for (i in c)  
           { printf i OFS c[i] 
             for (j in b) printf OFS (a[i FS j]?a[i FS j]:" --")
             printf RS}
     }' OFS="\t" infile

Name    EMP     ALLOWC  BASIC   INCER   INCR    REL
John    1234    01550   26000   01700    --     20000
Rob     3456     --     15000    --      --     01500
Debi    2345    01600   29000    --     01900   21000

# 6  
Old 02-13-2011
Rdcwayx, probably best to use emp# rather than name as your hash - just in case the data has two employees with the same name.

Code:
awk '{a[$2 FS $3]=$4; b[$3];c[$2]=$1} 
END {   printf "Name\tEMP\t";for (i in b) printf i OFS;printf RS; 
        for (i in c)  
           { printf c[i] OFS i 
             for (j in b) printf OFS (a[i FS j]?a[i FS j]:" --")
             printf RS}
     }' OFS="\t" infile

This User Gave Thanks to Chubler_XL For This Post:
# 7  
Old 02-13-2011
Yes, you are right, emp# should be always unique.

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Formatting the Output

Hi, I am trying to use printf command and format certain output in a specific format as under: While the left side (upto |) of the above format is part of a fixed header function, the right side is where i am expecting data to be printed. However, as seen, Row1 value is reflecting on last... (5 Replies)
Discussion started by: EmbedUX
5 Replies

2. Shell Programming and Scripting

Formatting the output

Hi, I have a file which contents entries in this form. Only in /data4/temp abc.000001 Only in /data4/temp abc.000003 Only in /data4/temp abc.000012 Only in /data4/temp abc.000120 Only in /data4/temp abc.000133 Only in /data4/temp abc.001444 i want to read line by line and format... (2 Replies)
Discussion started by: arijitsaha
2 Replies

3. Shell Programming and Scripting

Output Formatting

Hi Guys I need help removing some lines from output i am receiving from a shell script. Here is the output: http://i52.tinypic.com/10z0fut.png I am trying to remove the output that i have circled. . ${EDW}/extracts/bin/extracts_setup2.sh . ${EDW}/extracts/extracts.conf ... (7 Replies)
Discussion started by: mooey1232003
7 Replies

4. Shell Programming and Scripting

Formatting of output

Hi Experts, I have to create a report for certain audit and my output looks as follows I m trying to format my output to look like Any inputs would be highly appreciated Thanks Syed (5 Replies)
Discussion started by: maverick_here
5 Replies

5. Shell Programming and Scripting

formatting output

Sorry for being a n00b, but I'm having a lot more trouble than I should with formatting the output to the program I finally completed. I'm basically looking for the linux equivalent to setw( ) from c++ so that I can print things in columns like this (but without the underlines lol): MISSPELLED: ... (4 Replies)
Discussion started by: aikaterinimak
4 Replies

6. Shell Programming and Scripting

Formatting ls output

I am using find and ls to search for "warez" files on my server. find /home/ -regex ".*\.\(avi\|mp3\|mpeg\|mpg\|iso\)" -print0 | xargs -0 ls -oh This command produces this: -rw-r--r-- 1 1000 3.2M Feb 18 2009 /home/user/public_html/lupus.mp3 I want to only get this 3.2M... (4 Replies)
Discussion started by: bonrad
4 Replies

7. Shell Programming and Scripting

more help with formatting ls output...

Ok, for a fun project, my goal is to replicate the style of "catalog" on an old apple ] *A 002 SOMEAPPLESOFTFILE B 004 SOMEFILE T 006 SOMETEXT I 002 SOMEINTEGERFILE The first character is either " " or "*" depending on if the file is locked or not. Next is the filetype, so in... (1 Reply)
Discussion started by: patrick99e99
1 Replies

8. Shell Programming and Scripting

Formatting Output

Hi I tried running the below awk 'BEGIN { printf ("%s %-51s %s %-7s %s",$var1,$var2,$var3,$var4,$var5)}' from the command prompt and it is not working. Getting the error awk: Field $() is not correct. The source line number is 1. Actually my requirement is to form a string based on... (6 Replies)
Discussion started by: dhanamurthy
6 Replies

9. Shell Programming and Scripting

formatting output

Hi need some advice.. #grep -i hostname test.csv (gives the below output) HOSTNAME,name,host_test,,,,,,,, Now I need to format the above output as below. HOSTNAME: name=host_test Any easy way of doing this using awk or sed or printf? (4 Replies)
Discussion started by: balaji_prk
4 Replies

10. Shell Programming and Scripting

Formatting the output

Hi all, Have the following code(1) producing the results(2 & 3). Would like to know if there is a way to format the two reports created in a similar fashion. IE - The first is formatted nicely as a result of the echo "$xmpbdate $xavgs" >> $xmpbrpt However when I attempt to do the same on... (7 Replies)
Discussion started by: Cameron
7 Replies

Featured Tech Videos