我有一个文件,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
和tr
&paste
:
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'
-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,,,,