eum*_*iro 67

试试这个:

tr '\n' ',' < input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案最后留下一个逗号: (21认同)

Jon*_*ler 18

sed,你可以使用:

sed -e 'H;${x;s/\n/,/g;s/^,//;p;};d'
Run Code Online (Sandbox Code Playgroud)

H追加模式空间到保持空间(节省保留空间当前行).${...}仅适用于最后一行的环绕动作.这些行动是:x交换保持和模式空间; s/\n/,/g用逗号替换嵌入的换行符; s/^,//删除前导逗号(在保留空间的开头有一个换行符); 并p打印.在d删除模式空间-不打印.

你也可以使用,因此:

sed -n -e 'H;${x;s/\n/,/g;s/^,//;p;}'
Run Code Online (Sandbox Code Playgroud)

-n所以最终禁止显示默认打印d不再需要.

此解决方案假定CRLF行结尾是本地本机行结尾(因此您正在使用DOS),sed因此将生成以打印操作结束的本地本机行.如果您有DOS格式输入但想要Unix格式(仅限LF)输出,那么您必须更加努力 - 但您还需要在问题中明确规定.

它在MacOS X 10.6.5上运行正常,数字1..5,1..50和1..5000(单行输出中23,893个字符); 我不确定我是否想要更加努力地推动它.


gle*_*man 12

回应@ Jonathan对@ eumiro回答的评论:

tr -s '\r\n' ',' < input.txt | sed -e 's/,$/\n/' > output.txt
Run Code Online (Sandbox Code Playgroud)


Arn*_*aud 10

tr并且sed使用非常好但是当涉及文件解析和正则表达式时你无法击败perl(不确定为什么人们认为sed和tr比perl更接近shell ...)

perl -pe 's/\n/$1,/' your_file
Run Code Online (Sandbox Code Playgroud)

如果你想要纯shell来做它,那么看看字符串匹配

${string/#substring/replacement}
Run Code Online (Sandbox Code Playgroud)


gsb*_*bil 8

  • Awk版本:
    • awk '{printf("%s,",$0)}' input.txt
    • awk 'BEGIN{ORS=","} {print $0}' input.txt
    • 输出 - 1,2,3,4,5,

因为你要求1,2,3,4,5,比较1,2,3,4,5,(注意5之后的逗号,上面的大多数解决方案也包括尾随的逗号),这里还有两个版本用awk(带wcsed)来删除最后一个逗号:

  • 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*$//'


Ton*_*Nam 7

printf "1\n2\n3" | tr '\n' ','
Run Code Online (Sandbox Code Playgroud)

如果你想将其输出到文件中,只需执行以下操作

printf "1\n2\n3" | tr '\n' ',' > myFile
Run Code Online (Sandbox Code Playgroud)

如果你有文件中的内容

cat myInput.txt | tr '\n' ',' > myOutput.txt
Run Code Online (Sandbox Code Playgroud)


Nes*_*iza 6

使用粘贴命令。这里使用管道:

echo "1\n2\n3\n4\n5" | paste -s -d, /dev/stdin
Run Code Online (Sandbox Code Playgroud)

这是使用文件:

echo "1\n2\n3\n4\n5" > /tmp/input.txt
paste -s -d, /tmp/input.txt
Run Code Online (Sandbox Code Playgroud)

每一手册页s将所有行连接在一起,d允许定义分隔符。