我有一个像这样的文件,其 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
管道来解决此问题,因为awk
POSIX 明确定义了在最后一行缺少行尾时添加尾随换行符:
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