每第 N 次出现分隔符后添加新行

每第 N 次出现分隔符后添加新行

我有一个文件,roll.txt其中包含以下数据,采用逗号分隔格式,没有任何换行符。

'123456789','987651234','129873645','213456789','987612345','543216789','432156789','876543291','213465789','542637819','123456','23456','22234','3456','7890543','34567891,'2345','567'

我需要在每 6出现逗号分隔符后插入一个新行,并且每行末尾没有逗号。

以下是预期输出:

'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'

我正在使用以下sed命令,但该命令不起作用。

sed 's/[^,]//g'

答案1

trpaste

tr ',' '\n' <infile |paste -sd',,,,,\n'

为了更具可读性和理解性:

tr ',' '\n' <infile |paste --serial --delimiters=',,,,,\n'

在这种情况下,当你想在每次说时添加一个换行符时,N=100位置,那么你可能不喜欢输入 99 个逗号',,,,,,,,,, ... ,\n';相反,让我们printf通过大括号扩展为您生成它。

tr ',' '\n' <infile |paste -sd $(printf '%.1s' ,{1..99})'\n'

man paste:

-d, --delimiters=列表
       重用 LIST 中的字符而不是 TAB

-s,--串行
       一次粘贴一个文件而不是并行粘贴

答案2

至少对于 GNUsed假设您的字段不能包含嵌入的逗号分隔符,你可以做

sed 's/,/\n/6; P; D' roll.txt

它反复尝试用换行符替换第 6 个逗号,打印,然后删除直到换行符的模式空间部分。

注意:没有必要实现显式标记的测试/分支,因为该D命令在该行的其余部分隐式“重新启动循环”:

D
如果模式空间不包含换行符,则启动正常的新循环,就像发出 d 命令一样。否则,删除模式空间中直到第一个换行符的文本,并使用生成的模式空间重新启动循环,而不读取新的输入行

(感谢@RakeshSharma 澄清了这一点)。

前任。

sed 's/,/\n/6; P; D' roll.txt 
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'

或者,使用 Perl 的Text::CSV模块:

perl -MText::CSV -ne '
  BEGIN{$p = Text::CSV->new()} 
  @fields = $p->fields() if $p->parse($_); 
  do {
    print join ",", splice @fields, 0, 6; print "\n";
  } while @fields
' roll.txt
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'

答案3

一个变体αГsнιn 的回答:

$ tr ',' '\n' <file | paste -d, - - - - - -
'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'

这假设所有字段中都没有嵌入逗号。

如果输入没有六个字段的倍数,您可能会得到类似的输出

'123456789','987651234','129873645','213456789','987612345','543216789'
'432156789','876543291','213465789','542637819','123456','23456'
'22234','3456','7890543','34567891,'2345','567'
hello,world,,,,

相关内容