Bring values in the second column into single line (comma sep) for uniq value in the first column


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Bring values in the second column into single line (comma sep) for uniq value in the first column
# 1  
Old 08-25-2016
Bring values in the second column into single line (comma sep) for uniq value in the first column

I want to bring values in the second column into single line for uniq value in the first column.
My input
Code:
jvm01, Web 2.0 Feature Pack Library
jvm01, IBM WebSphere JAX-RS
jvm01, Custom01 Shared Library
jvm02, Web 2.0 Feature Pack Library
jvm02, IBM WebSphere JAX-RS
jvm03, Web 2.0 Feature Pack Library
jvm03, IBM WebSphere JAX-RS
jvm03, Custom03 Shared Library

Expecting this output
Code:
jvm01, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Custom01 Shared Library
jvm02, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS
jvm03, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Custom03 Shared Library

I could get result using below code,, but I do not like it. There got to be better way of doing this using awk/sed/perl one liner.
Code:
for jvm in $(cat file.txt | cut -d',' -f1 | uniq); do 
     libs=$(grep $jvm file.txt | cut -d',' -f2 | paste -s -d, -)
     echo "$jvm,$libs" 
done

jvm01, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Custom01 Shared Library
jvm02, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS
jvm03, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Custom03 Shared Library



Moderator's Comments:
Mod Comment Don't modify posts after people have reacted to it, pulling the rug from under them

Last edited by RudiC; 08-29-2016 at 11:10 AM.. Reason: correcting input
# 2  
Old 08-25-2016
Try:
Code:
awk '{for(i=3; i<=NF; i+=2) $i=x; gsub(FS FS,FS)}1' RS= FS=, OFS=, file

or
Code:
awk '!NF{print s; next} $1!=p{p=s=$1}{s=s FS $2} END{print s}' FS=, file

This User Gave Thanks to Scrutinizer For This Post:
# 3  
Old 08-25-2016
Both options are not working.

Code:
# awk '{for(i=3; i<=NF; i+=2) $i=x; gsub(FS FS,FS)}1' RS= FS=, OFS=, file
jvm01, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Custom01 Shared Library, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Custom03 Shared Library

Code:
# awk '!NF{print s; next} $1!=p{p=s=$1}{s=s FS $2} END{print s}' FS=, file
jvm03, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Custom03 Shared Library

# 4  
Old 08-26-2016
Please convert your input file to unix format first.
Code:
tr -d '\r' < old_file > new_file

# 5  
Old 08-26-2016
I verified if input file has "\r" using "od -c" I do not see carriage return characters. Still I followed your suggestion. I am getting same result.
Code:
# cat infile.txt
jvm01, Web 2.0 Feature Pack Library
jvm01, IBM WebSphere JAX-RS
jvm01, Custom01 Shared Library
jvm02, Web 2.0 Feature Pack Library
jvm02, IBM WebSphere JAX-RS
jvm03, Web 2.0 Feature Pack Library
jvm03, IBM WebSphere JAX-RS
jvm03, Custom03 Shared Library

# tr -d '\r' < infile.txt >infile1.txt; awk '!NF{print s; next} $1!=p{p=s=$1}{s=s FS $2} END{print s}' FS=, infile1.txt
jvm03, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Custom03 Shared Library

# 6  
Old 08-26-2016
Your NEW input sample deviates seriously from the one in post#1! Scrutinizer's both proposals rely on empty lines separating records.
# 7  
Old 08-26-2016
Hello kchinnam,

Could you please try following. If you are not bothered about the sequence of the output(same as Input_file) then following may help.
Code:
awk '{Q=$1} ($1 in A){$1=X} {A[Q]=A[Q]?A[Q] s1 $0:$0} END{for(i in A){print A[i]}}' s1=","   Input_file

Output will be as follows.
Code:
jvm01, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Custom01 Shared Library
jvm02, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS
jvm03, Web 2.0 Feature Pack Library, IBM WebSphere JAX-RS, Custom03 Shared Library

NOTE: As RudiC mentioned already your Input_file is different. I had used latest Input_file in above.

Thanks,
R. Singh

Last edited by RavinderSingh13; 08-26-2016 at 11:17 AM.. Reason: Added note here.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

HELP - uniq values per column

Hi All, I am trying to output uniq values per column. see file below. can you please assist? Thank you in advance. cat names joe allen ibm joe smith ibm joe allen google joe smith google rachel allen google desired output is: joe allen google rachel smith ibm (5 Replies)
Discussion started by: Apollo
5 Replies

2. Shell Programming and Scripting

Replacing values into a single column. sed/PERL

Hello everyone, i need to replace in the second column of my csv file, points by nothing and dash by comma like this: Input: 1 2 1;12.111.312-2;1.2;2;1-3 2 1 1;11.212.331-1;3.3;1;2-2 Output: 1 2 1;12111312;2;1.2;2;1-3 2 1 1;11212331;1;3.3;1;2-2 SED or PERL commands preferably. ... (7 Replies)
Discussion started by: satir
7 Replies

3. Shell Programming and Scripting

How to use regex on particular column (Removing comma from particular column)?

Hi, I have pipe separated file which contains some data having comma(,) in it. I want to remove the comma(,) only from particular column without changing data in other columns. Below is the sample data file, I want to remove the comma(,) only from 5th column. $ cat file1 ABC | DEF, HIJ|... (6 Replies)
Discussion started by: Prathmesh
6 Replies

4. Shell Programming and Scripting

splitting single column values into text and number component

Hey guys, I have a column that consists of string and integer values without a distinctive deliminator, looking like this... 7ASA 14LAL 245FOO 656MOM 87577DAD ... I want to split the column into two columns, one containing the numbers and one containing the text part. edit: numbers... (3 Replies)
Discussion started by: origamisven
3 Replies

5. UNIX for Dummies Questions & Answers

Re: How To Use UNIQ UNIX Command On single Column

Hi , Can You Please let Know How use unix uniq command on a single column for deleting records from file with Below Structure.Pipe Delimter File . Source Name | Account_Id A | 101 B... (2 Replies)
Discussion started by: anudeepkumar123
2 Replies

6. Shell Programming and Scripting

Multiple lines in a single column to be merged as a single line for a record

Hi, I have a requirement with, No~Dt~Notes 1~2011/08/1~"aaa bbb ccc ddd eee fff ggg hhh" Single column alone got splitted into multiple lines. I require the output as No~Dt~Notes 1~2011/08/1~"aaa<>bbb<>ccc<>ddd<>eee<>fff<>ggg<>hhh" mean to say those new lines to be... (1 Reply)
Discussion started by: Bhuvaneswari
1 Replies

7. Shell Programming and Scripting

rearrange the column names with comma as column delimiter

Hi, I am new to shell scripting, i have requirement can any one help me out in this regrads, in directory i have file like invoice1.txt, invoice2.txt in each file i have fixed number of columns, 62 in number but they are randomly arranged.like for first file invoice1.txt can have columns... (5 Replies)
Discussion started by: madhav62
5 Replies

8. Shell Programming and Scripting

Concatenating column values with unique id into single row

Hi, I have a table in Db2 with data say id_1 phase1 id_1 phase2 id_1 phase3 id_2 phase1 id_2 phase2 I need to concatenate the values like id_1 phase1,phase2,phase3 id_2 phase1,phase2 I tried recursive query but in vain as the length of string to be concatenated in quite long. ... (17 Replies)
Discussion started by: jsaravana
17 Replies

9. Shell Programming and Scripting

Converting Column values to comma delimted single Row

I have a requirement in which i have to read a file which has multiple columns seperated by a pipe "|" from this i have to read each column values seperately and create a comma seperated row for the column and write to another file. eg: Input file: ColA ColB 1 2 2 x 3 y... (5 Replies)
Discussion started by: nvuradi
5 Replies

10. Shell Programming and Scripting

need to get the last word in comma sep line

I have a file with aaa,bbb,ccc,dddd,eee,xyz aaa,bbb,ccc,dddd,eee,xyz,12345,rty aaa,bbb,ccc,dddd,eee,xyz,12345,rty,tsrt 1. line columns are not fixed 2. all words are seperated by comma what i want is always the string after last comma. regards, Senthil... (9 Replies)
Discussion started by: senthilk615
9 Replies
Login or Register to Ask a Question