如何从列中转换以下内容:
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
选项使其一次粘贴一个文件而不是并行粘贴。对于单个文件,此选项使其一次处理一行文件。
ter*_*don 16
这里有一些方法(尽管Lo\xc3\xafc\ 的paste
方法可能是最好的):
tr
$ tr \'\\n\' , < file\n1,2,3,4,5,6,.,.,.,.,98,99,100,$\n
Run Code Online (Sandbox Code Playgroud)\n这将用逗号替换所有换行符,但这意味着最后的尾随换行符也将被更改,因此您需要将其添加回来(请注意,这假设是 GNU sed
,但这就是您在 Linux 上拥有的换行符)通常是机器):
$ tr \'\\n\' , < file | sed \'s/,$/\\n/\'\n1,2,3,4,5,6,.,.,.,.,98,99,100\n
Run Code Online (Sandbox Code Playgroud)\n珀尔&sed
$ 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单独使用 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告诉-0777
perl “slurp”文件,将整个文件读入内存。然后,我们用逗号替换所有换行符,并用换行符替换最后一个逗号。这-pe
意味着“在应用由”给出的脚本后打印输入文件的每一行-e
。
请注意,这两种方法都将整个文件存储在内存中,因此它们可能不适合非常大的文件。
\nawk
&sed
$ awk -v ORS="," \'1\' file | sed \'s/,$/\\n/\'\n1,2,3,4,5,6,.,.,.,.,98,99,100\n
Run Code Online (Sandbox Code Playgroud)\nPure awk
(感谢Ed Morton在评论中提供了这种方法)
$ 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。
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)
使用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 中,put
andsay
将为您添加换行符(虽然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)