122user321
122user321

Reputation: 231

Unix command to convert multiple line data in a single line along with delimiter

Here is the actual file data:

abc
def
ghi
jkl
mno

And the required output should be in this format:

'abc','def','ghi','jkl','mno'

The command what I used to do this gives output as:

abc,def,ghi,jkl,mno

The command is as follows:

sed -n 's/[0-3]//;s/ //;p' Split_22_05_2013 | \
  awk -v ORS= '{print $0" ";if(NR%4==0){print "\n"}}'

Upvotes: 1

Views: 7659

Answers (8)

TrueY
TrueY

Reputation: 7610

In response to sudo_O's comment I add an awk less solution in pure bash. It does not exec any program at all. Of course instead of <<XXX ... XXX (here-is-the-document) stuff one could add <filename.

set c=""
while read w; do
  echo -e "$c'$w'\c"
  c=,
done<<XXX
abc
def
ghi
jkl
mno
XXX

Output:

'abc','def','ghi','jkl','mno'

An even shorter version:

printf -v out ",'%s'" $(<infile)
echo ${out:1}

Without the horrifying pipe snakes You can try something like this:

awk 'NR>1{printf ","}{printf "\x27%s\x27",$0}' <<XXX
abc
def
ghi
jkl
mno
XXX

Output:

'abc','def','ghi','jkl','mno'

Or an other version which reads the whole input as one line:

awk -vRS="" '{gsub("\n","\x27,\x27");print"\x27"$0"\x27"}'

Or a version which lets awk uses the internal variables more

awk -vRS="" -F"\n" -vOFS="','" -vORS="'" '{$1=$1;print ORS $0}'

The $1=$1; is needed to tell to awk to repack $0 using the new field and record separators (OFS, ORS).

Upvotes: 4

Sidharth C. Nadhan
Sidharth C. Nadhan

Reputation: 2253

 perl -l54pe 's/.*/\x27$&\x27/' file

Upvotes: 1

Thor
Thor

Reputation: 47099

This can be done pretty briefly with sed and paste:

<infile sed "s/^\|\$/'/g" | paste -sd,

Or more portably (I think, cannot test right now):

sed "s/^\|\$/'/g" infile | paste -s -d , -

Upvotes: 2

aragaer
aragaer

Reputation: 17848

Using sed alone:

sed -n "/./{s/^\|\$/'/g;H}; \${x;s/\n//;s/\n/,/gp};" test.txt

Edit: Fixed, it should also work with or without empty lines now.

Upvotes: 3

Vatine
Vatine

Reputation: 21258

awk 'seen == 1 { printf("'"','"'%s", $1);} seen == 0 {seen = 1; printf("'"'"'%s", $1);} END { printf("'"'"'\n"); }'

In slightly more readable format (suitable for awk -f):

# Print quote-terminator, separator, quote-start, thing
seen == 1 { printf("','%s", $1); }
# Set the "print separator" flag, print quote-start thing
seen == 0 { seen = 1; printf("'%s", $1}; }
END { printf("'\n"); } # Print quote-end

Upvotes: 1

Fredrik Pihl
Fredrik Pihl

Reputation: 45652

$ sed "s/[^ ][^ ]*/'&',/g" input.txt | tr -d '\n'
'abc','def','ghi','jkl','mno',

To clean the last ,, throw in a

| sed 's/,$//'

Upvotes: 1

Alper
Alper

Reputation: 13220

$ cat file 
abc
def
ghi
jkl
mno

$ cat file | tr '\n' ' ' | awk -v q="'" -v OFS="','" '$1=$1 { print q $0 q }'
'abc','def','ghi','jkl','mno'
  1. Replace '\n' with ' ' -> (tr '\n\ ' ')
  2. Replace each separator (' ' space) with (',' quote-comma-quote) -> (-v OFS="','")
  3. Add quotes to the begin and end of line -> (print q $0 q)

Upvotes: 2

miku
miku

Reputation: 188014

$ cat test.txt
abc
def
ghi
jkl
mno

$ cat test.txt | tr '\n' ','
abc,def,ghi,jkl,mno,

$ cat test.txt | awk '{print "\x27" $1 "\x27"}' | tr '\n' ','
'abc','def','ghi','jkl','mno',

$ cat test.txt | awk '{print "\x27" $1 "\x27"}' | tr '\n' ',' | sed 's/,$//'
'abc','def','ghi','jkl','mno'

The last command can be shortened to avoid UUOC:

$ awk '{print "\x27" $1 "\x27"}' test.txt | tr '\n' ',' | sed 's/,$//'
'abc','def','ghi','jkl','mno'

Upvotes: 3

Related Questions