vin*_*itu 42 bash shell text-processing newline
我有input.txt
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
我需要得到这样的output.txt
1,2,3,4,5
Run Code Online (Sandbox Code Playgroud)
怎么做?
eum*_*iro 67
试试这个:
tr '\n' ',' < input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)
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)
awk '{printf("%s,",$0)}' input.txtawk 'BEGIN{ORS=","} {print $0}' input.txt1,2,3,4,5,因为你要求1,2,3,4,5,比较1,2,3,4,5,(注意5之后的逗号,上面的大多数解决方案也包括尾随的逗号),这里还有两个版本用awk(带wc和sed)来删除最后一个逗号:
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*$//'
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)
使用粘贴命令。这里使用管道:
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允许定义分隔符。