Since you asked for 1,2,3,4,5, as compared to 1,2,3,4,5, (note the comma after 5, most of the solutions above also include the trailing comma), here are two more versions with Awk (with wc and sed) to get rid of the last comma:
The H appends the pattern space to the hold space (saving the current line in the hold space). The ${...} surrounds actions that apply to the last line only. Those actions are: x swap hold and pattern space; s/\n/,/g substitute embedded newlines with commas; s/^,// delete the leading comma (there's a newline at the start of the hold space); and p print. The d deletes the pattern space - no printing.
You could also use, therefore:
sed -n -e 'H;${x;s/\n/,/g;s/^,//;p;}'
The -n suppresses default printing so the final d is no longer needed.
This solution assumes that the CRLF line endings are the local native line ending (so you are working on DOS) and that sed will therefore generate the local native line ending in the print operation. If you have DOS-format input but want Unix-format (LF only) output, then you have to work a bit harder - but you also need to stipulate this explicitly in the question.
It worked OK for me on MacOS X 10.6.5 with the numbers 1..5, and 1..50, and 1..5000 (23,893 characters in the single line of output); I'm not sure that I'd want to push it any harder than that.
Use paste command. Here is using pipes:
Here is using a file:
Per man pages the s concatenates all lines and d allows to define the delimiter character.
python version:
python -c 'import sys; print(",".join(sys.stdin.read().splitlines()))'
Doesn't have the trailing comma problem (because
join
works that way), andsplitlines
splits data on native line endings (and removes them).In response to @Jonathan's comment to @eumiro's answer:
awk '{printf("%s,",$0)}' input.txt
awk 'BEGIN{ORS=","} {print $0}' input.txt
1,2,3,4,5,
Since you asked for
1,2,3,4,5
, as compared to1,2,3,4,5,
(note the comma after 5, most of the solutions above also include the trailing comma), here are two more versions with Awk (withwc
andsed
) to get rid of the last comma:i='input.txt'; awk -v c=$(wc -l $i | cut -d' ' -f1) '{printf("%s",$0);if(NR<c){printf(",")}}' $i
awk '{printf("%s,",$0)}' input.txt | sed 's/,\s*$//'
With
sed
, you could use:The
H
appends the pattern space to the hold space (saving the current line in the hold space). The${...}
surrounds actions that apply to the last line only. Those actions are:x
swap hold and pattern space;s/\n/,/g
substitute embedded newlines with commas;s/^,//
delete the leading comma (there's a newline at the start of the hold space); andp
print. Thed
deletes the pattern space - no printing.You could also use, therefore:
The
-n
suppresses default printing so the finald
is no longer needed.This solution assumes that the CRLF line endings are the local native line ending (so you are working on DOS) and that
sed
will therefore generate the local native line ending in the print operation. If you have DOS-format input but want Unix-format (LF only) output, then you have to work a bit harder - but you also need to stipulate this explicitly in the question.It worked OK for me on MacOS X 10.6.5 with the numbers 1..5, and 1..50, and 1..5000 (23,893 characters in the single line of output); I'm not sure that I'd want to push it any harder than that.