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

gol*_*ife 4 text-processing

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

1
2
3
4
5
6
.
.
.
.
98
99
100
Run Code Online (Sandbox Code Playgroud)

到以逗号分隔的行:

1,2,3,4,5,6,....,98,99,100
Run Code Online (Sandbox Code Playgroud)

我正在使用Linux。

Loï*_*ier 19

您可以按如下方式使用该paste命令:

paste -sd, file.txt
Run Code Online (Sandbox Code Playgroud)

默认情况下,paste“将由每个文件中按顺序对应的行组成的行(以制表符分隔)写入标准输出”(引自手册)。该-d选项设置替代输出分隔符,并且该-s选项使其一次粘贴一个文件而不是并行粘贴。对于单个文件,此选项使其一次处理一行文件。

  • @golf4life 无论输入是数字、IP 地址、鱼名还是其他任何内容,都与此解决方案无关。“这并没有真正起作用”是最糟糕的问题陈述,因为它没有告诉我们任何有关故障的信息,而我们可以使用这些信息来帮助您调试问题。 (6认同)
  • @golf4life 假设您的输入数据实际上是 Unix 文本文件而不是 DOS 或 Windows 文本文件,那么应该按所述工作。如果来自 Windows 系统,请使用“dos2unix”将其转换为 Unix 文本文件。 (4认同)
  • 另外,@golf4life 请确保您的示例准确地代表您的数据。如果你有 IP,那么你也有“.”,而不仅仅是数字,这会影响我们使用的工具。请确保您给出的示例尽可能接近您的真实数据。 (3认同)

ter*_*don 16

这里有一些方法(尽管Lo\xc3\xafc\ 的paste方法可能是最好的):

\n
    \n
  • tr

    \n
    $ tr \'\\n\' , < file\n1,2,3,4,5,6,.,.,.,.,98,99,100,$\n
    Run Code Online (Sandbox Code Playgroud)\n

    这将用逗号替换所有换行符,但这意味着最后的尾随换行符也将被更改,因此您需要将其添加回来(请注意,这假设是 GNU sed,但这就是您在 Linux 上拥有的换行符)通常是机器):

    \n
    $ tr \'\\n\' , < file | sed \'s/,$/\\n/\'\n1,2,3,4,5,6,.,.,.,.,98,99,100\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 珀尔&sed

    \n
    $ perl -pe \'s/\\n/,/\' file | sed \'s/,$/\\n/\'\n1,2,3,4,5,6,.,.,.,.,98,99,100\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 单独使用 Perl

    \n
    $ perl -lne \'push @l,$_; END{print join ",",@l; }\' file \n1,2,3,4,5,6,.,.,.,.,98,99,100\n
    Run Code Online (Sandbox Code Playgroud)\n

    或者:

    \n
    $ perl -0777 -pe \'s/\\n/,/g; s/,$/\\n/;\' file \n1,2,3,4,5,6,.,.,.,.,98,99,100\n
    Run Code Online (Sandbox Code Playgroud)\n

    告诉-0777perl “slurp”文件,将整个文件读入内存。然后,我们用逗号替换所有换行符,并用换行符替换最后一个逗号。这-pe意味着“在应用由”给出的脚本后打印输入文件的每一-e

    \n

    请注意,这两种方法都将整个文件存储在内存中,因此它们可能不适合非常大的文件。

    \n
  • \n
  • awk&sed

    \n
    $ awk -v ORS="," \'1\' file | sed \'s/,$/\\n/\'\n1,2,3,4,5,6,.,.,.,.,98,99,100\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • Pure awk(感谢Ed Morton在评论中提供了这种方法)

    \n
    $ awk \'{printf "%s%s", sep, $0; sep=","} END{print ""}\' file \n1,2,3,4,5,6,.,.,.,.,98,99,100\n
    Run Code Online (Sandbox Code Playgroud)\n

    1只是“打印”的简写。在 awk 中,当某项计算结果为 true 时,默认操作是打印当前行,因此1经常使用,因为1始终为 true。

    \n
  • \n
\n


Kus*_*nda 12

使用 GNU datamash

$ datamash -t , transpose <file
1,2,3,4,5,6,.,.,.,.,98,99,100
Run Code Online (Sandbox Code Playgroud)

如果数据由多个逗号分隔的列组成(即,如果它是简单的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
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)


jub*_*us1 7

使用Raku(以前称为 Perl6)

~$ raku -e 'lines.join(",").put;'  file
Run Code Online (Sandbox Code Playgroud)

Raku 有一个主力lines例程,默认情况下会去除行终止符,返回 a Seq,这是 Raku 中的轻量级可迭代数据结构。如果您需要一个逗号分隔的行,只需join在逗号上(否则您将得到由单个空格分隔的元素的输出)。

输入示例:

1
2
3
4
5
6
Run Code Online (Sandbox Code Playgroud)

示例输出:

1,2,3,4,5,6
Run Code Online (Sandbox Code Playgroud)

在 Raku 中,putandsay将为您添加换行符(虽然say应该从生产脚本中保留,但它仅用于代码审查,因为它返回“人类可读”的输出)。Raku 也有print,它不会在末尾添加换行符。

Raku 中的默认值基本上相当于 Perl 的-l命令行标志,其中换行符在输入时自动截断。因此,通过使用for 输出,您可以以与@terdon 的print“Perl &”答案相同的方式编写简单的代码(请注意下面的波形符用于字符串连接,但您也可以轻松编写):sed~print "$_,"

~$ raku -ne 'print $_ ~ ",";' file.txt | raku -pe  's/\,$//;'
1,2,3,4,5,6 
Run Code Online (Sandbox Code Playgroud)