我有输入.txt
1
2
3
4
5
我需要得到这样的输出.txt
1,2,3,4,5
如何做?
试试这个:
tr '\n' ',' < input.txt > output.txt
使用
sed
,您可以使用:
sed -e 'H;${x;s/\n/,/g;s/^,//;p;};d'
H
将模式空间追加到保留空间(将当前行保存在保留空间中)。 ${...}
包围仅适用于最后一行的操作。 这些动作是: x
交换保持和模式空间; s/\n/,/g
用逗号替换嵌入的换行符; s/^,//
删除前导逗号(保留空间的开头有一个换行符);和 p
打印。 d
删除图案空间 - 不打印。
你也可以使用,因此:
sed -n -e 'H;${x;s/\n/,/g;s/^,//;p;}'
-n
会抑制默认打印,因此不再需要最后的 d
。
此解决方案假设 CRLF 行结尾是本地本机行结尾(因此您正在 DOS 上工作),因此
sed
将在打印操作中生成本地本机行结尾。 如果你有 DOS 格式的输入,但想要 Unix 格式(仅限 LF)输出,那么你必须更加努力 - 但你也需要在问题中明确规定这一点。
它在 MacOS X 10.6.5 上对我来说工作正常,数字为 1..5、1..50 和 1..5000(单行输出中有 23,893 个字符);我不确定我是否愿意更努力地推动它。
回应@Jonathan 对@eumiro 的回答的评论:
tr -s '\r\n' ',' < input.txt | sed -e 's/,$/\n/' > output.txt
使用
paste
命令。这是使用管道:
echo "1\n2\n3\n4\n5" | paste -s -d, /dev/stdin
这里使用一个文件:
echo "1\n2\n3\n4\n5" > /tmp/input.txt
paste -s -d, /tmp/input.txt
每个手册页中 s 连接所有行,d 允许定义分隔符。
tr
和 sed
曾经非常好,但是当涉及到文件解析和正则表达式时,你无法击败 perl
(不知道为什么人们认为 sed 和 tr 比 perl 更接近 shell...)
perl -pe 's/\n/$1,/' your_file
如果你想要纯 shell 来做,那么看看字符串匹配
${string/#substring/replacement}
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 版本(带有 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' ','
如果你想将其输出到文件中,只需这样做
printf "1\n2\n3" | tr '\n' ',' > myFile
如果您有文件中的内容,请执行
cat myInput.txt | tr '\n' ',' > myOutput.txt
python版本:
python -c 'import sys; print(",".join(sys.stdin.read().splitlines()))'
没有尾随逗号问题(因为
join
就是这样工作的),并且 splitlines
在本机行尾上分割数据(并删除它们)。
cat input.txt | sed -e 's|$|,|' | xargs -i echo "{}"