如何从列中转换以下内容:
1
2
3
4
5
6
.
.
.
.
98
99
100
到以逗号分隔的行:
1,2,3,4,5,6,....,98,99,100
我正在使用Linux。
答案1
您可以paste
按如下方式使用该命令:
paste -sd, file.txt
默认情况下,paste
“将由每个文件中按顺序对应的行组成的行(以制表符分隔)写入标准输出”(引自手册)。该-d
选项设置替代输出分隔符,并且该-s
选项使其一次粘贴一个文件而不是并行粘贴。对于单个文件,此选项使其一次处理一行文件。
答案2
这里有一些方法(虽然卢伊克的paste
方法可能是最好的):
tr
$ tr '\n' , < file 1,2,3,4,5,6,.,.,.,.,98,99,100,$
这将用逗号替换所有换行符,但这意味着最后的尾随换行符也将被更改,因此您需要将其添加回来(请注意,这假设是 GNU
sed
,但这通常是 Linux 机器上的换行符) :$ tr '\n' , < file | sed 's/,$/\n/' 1,2,3,4,5,6,.,.,.,.,98,99,100
珀尔&
sed
$ perl -pe 's/\n/,/' file | sed 's/,$/\n/' 1,2,3,4,5,6,.,.,.,.,98,99,100
单独使用 Perl
$ perl -lne 'push @l,$_; END{print join ",",@l; }' file 1,2,3,4,5,6,.,.,.,.,98,99,100
或者:
$ perl -0777 -pe 's/\n/,/g; s/,$/\n/;' file 1,2,3,4,5,6,.,.,.,.,98,99,100
告诉
-0777
perl “slurp”文件,将整个文件读入内存。然后,我们用逗号替换所有换行符,并用换行符替换最后一个逗号。办法-pe
”p应用-e
“.请注意,这两种方法都将整个文件存储在内存中,因此它们可能不适合非常大的文件。
awk
&sed
$ awk -v ORS="," '1' file | sed 's/,$/\n/' 1,2,3,4,5,6,.,.,.,.,98,99,100
纯粹
awk
(感谢埃德·莫顿谁在评论中提供了这种方法)$ awk '{printf "%s%s", sep, $0; sep=","} END{print ""}' file 1,2,3,4,5,6,.,.,.,.,98,99,100
这
1
只是“打印”的简写。在 awk 中,当某项计算结果为 true 时,默认操作是打印当前行,因此1
经常使用,因为1
始终为 true。
答案3
使用 GNU datamash
:
$ datamash -t , transpose <file
1,2,3,4,5,6,.,.,.,.,98,99,100
如果您的数据由以下内容组成,这也将正确转置您的数据:多种的以逗号分隔的列(即,如果它是简单的CSV 格式):
$ cat f
1,1,1,1
2,2,2,2
3,3,3,3
4,4,4,4
5,5,5,5
6,6,6,6
.,.,.,.
.,.,.,.
.,.,.,.
.,.,.,.
98,98,98,98
99,99,99,99
100,100,100,100
$ datamash -t , transpose <f
1,2,3,4,5,6,.,.,.,.,98,99,100
1,2,3,4,5,6,.,.,.,.,98,99,100
1,2,3,4,5,6,.,.,.,.,98,99,100
1,2,3,4,5,6,.,.,.,.,98,99,100
答案4
sed
为了完整起见,解决方案:
% cat =commas
#!/bin/bash
# Other ways of doing it:
#sed -n 'H;${g;s/\n//;s//,/g;p}'
#sed -n '1h;1!H;${g;s/\n/,/g;p}'
sed ':b;N;$!bb;s/\n/,/g'
不过,我想我将开始使用 Loïc 的paste
解决方案。