Combining many lines to one using awk or any unix cmd


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Combining many lines to one using awk or any unix cmd
# 1  
Old 05-06-2009
Combining many lines to one using awk or any unix cmd

Combining many lines to one using awk or any unix cmd


Inputfile:
Quote:
ID,place,org,animal,country
ITS234,chicago,zoo,Tiger,America
ITS234,chicago,zoo,lion,America
ITS234,chicago,zoo,zebra,America
Output :
Quote:
ID,place,org,animal,country
ITS234,chicago,zoo,Tiger lion zebra,America
Appreciate help on this.
# 2  
Old 05-06-2009
zenith,
were exactly are stuck in your code?
# 3  
Old 05-06-2009
Quote:
Originally Posted by vgersh99
zenith,
were exactly are stuck in your code?

I tried till here but doesnt work:
Code:
nawk -F, '{k= ($1 SUBSEP $2 SUBSEP $3) u[k]++ d[k] = d[k] ? d[k] RS $0: $0} END { for (K in u) if (u[K] > 1) print d[K] } ' infile


The below input file i modified.
Quote:
Inputfile:
ID,place,org,animal,country
ITS234,chicago,zoo,Tiger,America
ITS234,chicago,USzoo,lion,America
ITS234,chicago,INzoo,zebra,America

Output file:

Quote:
ITS234,chicago,zoo USZoo INzoo,Tiger lion zebra,America

The key is first 2 columns of file.
If the first 2 columns matches then the remaining columns are combined to on column for different records

This is complex to implement.
Help is highly appreciated
# 4  
Old 05-06-2009
Quote:
Originally Posted by zenith
I tried till here but doesnt work:
Code:
nawk -F, '{k= ($1 SUBSEP $2 SUBSEP $3) u[k]++ d[k] = d[k] ? d[k] RS $0: $0} END { for (K in u) if (u[K] > 1) print d[K] } ' infile


The below input file i modified.



Output file:




The key is first 2 columns of file.
If the first 2 columns matches then the remaining columns are combined to on column for different records

This is complex to implement.
Help is highly appreciated

I think this cannot be implemented in unix
# 5  
Old 05-06-2009
nawk -f zen.awk myInputFile

zen.awk:
Code:
BEGIN {
  FS=OFS=","
  SEP=" "
}
{
  idx=$1 OFS $2
  idxA[idx]
  for(i=3; i<=NF; i++) {
    n=split(cols[idx, i], tmp, OFS)
    if (n==0)
       cols[idx,i]=$i
    else {
      for(j=1; j<=n; j++)
        if (tmp[j]==$i) break
      if (j>n) cols[idx,i]=cols[idx,i] SEP $i
    }
  }
  nf=NF
}
END {
  for(i in idxA) {
    printf("%s%c", i, OFS)
    for(j=3; j<=nf; j++)
      printf("%s%c", cols[i,j], (j==nf)?RS:OFS)
  }
}

# 6  
Old 05-06-2009
Quote:
Originally Posted by vgersh99
nawk -f zen.awk myInputFile

zen.awk:
Code:
BEGIN {
  FS=OFS=","
  SEP=" "
}
{
  idx=$1 OFS $2
  idxA[idx]
  for(i=3; i<=NF; i++) {
    n=split(cols[idx, i], tmp, OFS)
    if (n==0)
       cols[idx,i]=$i
    else {
      for(j=1; j<=n; j++)
        if (tmp[j]==$i) break
      if (j>n) cols[idx,i]=cols[idx,i] SEP $i
    }
  }
  nf=NF
}
END {
  for(i in idxA) {
    printf("%s%c", i, OFS)
    for(j=3; j<=nf; j++)
      printf("%s%c", cols[i,j], (j==nf)?RS:OFS)
  }
}

Thank you very much vgersh99

The output is
Quote:
ITS234,chicago,zoo USzoo INzoo,Tiger lion zebra,America America
But i wanted
Quote:
ITS234,chicago,zoo USzoo INzoo,Tiger lion zebra,America
This coded provied by you helped.
Thanks
# 7  
Old 05-06-2009
make sure your fields have no 'leading' and/or 'trailing spaces.
Otherwise:
Code:
BEGIN {
  FS=OFS=","
  SEP=" "
}
function trim(str)
{
    sub("^[ ]*", "", str);
    sub("[ ]*$", "", str);
    return str;
}

{
  idx=trim($1) OFS trim($2)
  idxA[idx]
  for(i=3; i<=NF; i++) {
    n=split(cols[idx, i], tmp, OFS)
    if (n==0)
       cols[idx,i]=trim($i)
    else {
      for(j=1; j<=n; j++)
        if (tmp[j]==trim($i)) break
      if (j>n) cols[idx,i]=cols[idx,i] SEP trim($i)
    }
  }
  nf=NF
}
END {
  for(i in idxA) {
    printf("%s%c", i, OFS)
    for(j=3; j<=nf; j++)
      printf("%s%c", cols[i,j], (j==nf)?RS:OFS)
  }
}

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Combining two lines into one, UNIX

Hi All, I have a file which has the following sample lines -- <Member name="Canada" Currency="CAD" -- <Member name="UK" Currency="GBP" -- <Member name="Switzerland" Currency="CHF" -- <Member name="Germany" Currency="EUR" -- (11 Replies)
Discussion started by: dev.devil.1983
11 Replies

2. Shell Programming and Scripting

Reading two lines in a while loop and combining the lines

Dear all, I have a file like this: imput scaffold_0 1 scaffold_0 10000 scaffold_0 20000 scaffold_0 25000 scaffold_1 1 scaffold_1 10000 scaffold_1 20000 scaffold_1 23283 and I want the output like this: scaffold_0 1 scaffold_0 10000 scaffold_0 10000 scaffold_0 20000... (6 Replies)
Discussion started by: valente
6 Replies

3. Shell Programming and Scripting

awk and combining lines to stdout

I am trying to come up with a good approach to taking a file and only printing 10 columns. The input file has duplicate lines but only the 6th column has real value. I just need to combine the lines and output 1 line per example file: 1 2.0765 AA 10 0.6557 ..... 1 2.0765 AA 10 0.6655 ..... 2... (12 Replies)
Discussion started by: mykey242
12 Replies

4. Shell Programming and Scripting

Unix cmd prompt how to get old cmd run?

Hi, I am using SunOS I want to serch my previous command from unix prompt (like on AIX we can search by ESC -k) how to get in SunOs urgent help require. (10 Replies)
Discussion started by: RahulJoshi
10 Replies

5. Shell Programming and Scripting

searching thru or combining multiple lines in a unix file

This is the problem actually: This regex: egrep "low debug.*\".*\"" $dbDir/alarmNotification.log is looking for data between the two quotation marks: ".*\" When I hate data like this: low debug 2009/3/9 8:30:20.47 ICSNotificationAlarm Prodics01ics0003 IC... (0 Replies)
Discussion started by: ndedhia1
0 Replies

6. Shell Programming and Scripting

combining lines between 2 pattern using awk

Hi I am fairly new to shell scripting i have some file with outout 1011 abc fyi 6.1.4.5 abr tio 70986 dfb hji 4.1.7 ....some text 111114 i have to format this text to 1011 abc fyi 6.1.4.5 abr tio 70986 dfb hji 4.1.7 ....some text 111114 (3 Replies)
Discussion started by: shell.scriptor
3 Replies

7. Shell Programming and Scripting

combining unix commands and awk program

Dear Experts I am trying to find if it is possible to combine unix commands in awk program. For example if it is possible embed rm or ls or any unix command inside the awk program and while it is reading the file besides printing be able to do some unix commands. I am thinking may be just print... (2 Replies)
Discussion started by: Reza Nazarian
2 Replies

8. Shell Programming and Scripting

help combining lines in awk

I seem to have gotten myself in over my head on this one. I need help combining lines together. I have a text file containing 24,000 lines (exactly why I need awk) due to bad formatting it has separated the lines (ideally it should be 12,000 lines total). Example of file: ... (2 Replies)
Discussion started by: blueheed
2 Replies

9. Shell Programming and Scripting

need help appending lines/combining lines within a file...

Is there a way to combine two lines onto a single line...append the following line onto the previous line? I have the following file that contains some blank lines and some lines I would like to append to the previous line... current file: checking dsk c19t2d6 checking dsk c19t2d7 ... (2 Replies)
Discussion started by: mr_manny
2 Replies

10. UNIX for Dummies Questions & Answers

get only a few lines from a unix cmd

I'd like to get only the first 5 lines of the ls -lt command, i tried to pass to head as a file ip but didnt work, is there any other way to do it. I am trying to find the lates log files for the last 5 days. what i tried head -5 < ls -lt alog* Thanks. -d (1 Reply)
Discussion started by: dharma
1 Replies
Login or Register to Ask a Question