在 bash 中用另一个字符更改换行符

在 bash 中用另一个字符更改换行符

我有一个像这样的文件,其 ID 多行,但我需要所有记录都在同一行上:

8600
22007
93509
9984
22146

8600,22007,93509,9984,22146

即使我可以使用 sed 在 vi​​ 中执行此操作1,$ s/\n/,/g,我也需要使用 bash 自动执行此操作。

我尝试过sed -i 's/\n/,/g' filename但没有运气。任何想法 ?

答案1

使用单个paste命令:

paste -d, -s infile

-s使命令打印行s序列号以-d,逗号分隔。

答案2

您可以使用tr

tr '\n' ,

这将会改变每一个的实例\n改为逗号,因此您需要修复最后一个。这是一个例子

cat >file.txt <<x
8600
22007
93509
9984
22146
x

tr '\n' , <file.txt
8600,22007,93509,9984,22146,        # and the shell prompt follows immediately

tr '\n' , <file.txt | sed 's/,$/\n/'
8600,22007,93509,9984,22146         # line is ended with newline

请注意,这种使用sed不是由 POSIX 定义的,POSIX 期望所有行都以换行符终止。您可以通过插入awk 1管道来解决此问题,因为awkPOSIX 明确定义了在最后一行缺少行尾时添加尾随换行符:

tr '\n' , <file.txt | awk 1 | sed 's/,$//'
8600,22007,93509,9984,22146         # line is ended with newline

对于快速修复,这是可以接受的(尽管paste其他地方提供的解决方案更好)。然而,tr | awk | sed这是一个丑陋的组合,应该在生产代码中重新审视。所以我们可以这样结束:

awk 'NR>1 {printf ","}; {printf "%s", $0}; END {printf "\n"}' file.txt

答案3

使用 GNUsed并假设环境中没有POSIXLY_CORRECT变量,或者如果有的话,输入至少有两行:

sed ':a;N;$!ba;s/\n/,/g' input.txt

我们无法替换换行符。但我们可以通过添加上面的所有行来完成......

答案4

方法一:

perl -pe 's/\n/,/ unless eof' filename

输出

8600,22007,93509,9984,22146

方法2(使用Python)

#!/usr/bin/python
m=open('file.txt','r')
j=[]
for i in m:
    j.append(i.strip())
print ",".join(j)

输出

python i.py 
8600,22007,93509,9984,22146

相关内容