将一列中的数百个数字转换为以逗号分隔的行

将一列中的数百个数字转换为以逗号分隔的行

如何从列中转换以下内容:

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
    

    告诉-0777perl “slurp”文件,将整个文件读入内存。然后,我们用逗号替换所有换行符,并用换行符替换最后一个逗号。办法-pep应用-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解决方案。

相关内容