我有一个像这样的文件
Hello,Hi,Hullo,Hammers,Based,Random
对于n=2
,输出必须是这样的
Hello,Hi
Hullo,Hammers
Based,Random
对于n=3
,输出必须是这样的
Hello,Hi,Hullo
Hammers,Based,Random
我如何使用 awk/sed 来完成这个任务?
编辑:n
是字段数的一个因素
我有一个像这样的文件
Hello,Hi,Hullo,Hammers,Based,Random
对于n=2
,输出必须是这样的
Hello,Hi
Hullo,Hammers
Based,Random
对于n=3
,输出必须是这样的
Hello,Hi,Hullo
Hammers,Based,Random
我如何使用 awk/sed 来完成这个任务?
编辑:n
是字段数的一个因素
在您的问题中,您没有解决如何处理字段数不均分的情况,
n
所以我也没有在这里解决。tr
使用and的另一种方法paste
:对于 n=2,
对于 n=3,
使用 perl:
这使用第一个参数作为每个输出行打印的条目数(使用变量
$n
)。STDIN 和任何文件名参数都用作输入。由于该
-F,
选项(隐式启用-a
and-n
选项),它会自动读取每个输入行并用逗号将其拆分为 array@F
,然后迭代数组的索引,$n
一次项。$n
元素打印在每个输出行上。注意:如果您需要解析带有引号字段和嵌入引号中的逗号而不是简单的逗号分隔输入的实际 CSV,请使用Text::CSV模块。
带有参数的输出,
3
而不是2
:再次使用
4
:awk
再次,输入由和 换行符分隔的任何一组值,输出一个固定宽度的 csv:
,
与
perl
:这个问题让我想到了
python
zip/iter 内置函数:使用Raku(以前称为 Perl_6)
样本输入:
示例输出
.rotor(3)
(从上面):上面的示例输出更改为
.rotor(2)
:上面的代码是 Raku 中的基本实现(返回列之间的单个空格)。该调用决定了列的数量[参见下面关于和
rotor()
之间的区别的讨论]。如果您想使用逗号、制表符、管道等连接列,只需添加一个调用:rotor()
batch()
.join()
请注意,默认情况下
rotor()
仅返回完整组,并在最后删除部分组。因此rotor(4)
,对上述六元素样本执行调用将产生单行输出,长度为 4 个元素。为确保不丢失数据,请使用rotor(4, :partial)
或batch(4)
。真实的 CSV 解析器(例如 Raku 的
Text::CSV
模块)的处理将验证生成的 CSV 文件。有关示例,请参见下面的 URL。https://unix.stackexchange.com/a/701805/227738
https://raku.org
使用
sed
除了明显的 awk/Perl/sed 方法,我可以推荐Miller
它可以很好地提取和修改基于文本的数据,并且使用起来更直观。