在文本文件中添加逗号

时间:2016-08-25 18:44:44

标签: perl awk sed

我有一个以下格式的文本文件

group1: 2010EL-1749 2010EL-1749_00001 3554-08 3554-08_01855 2010EL-1749_00002
group2: 2010EL-1749 2010EL-1749_00002 3554-08 3554-08_01856 2010EL-1749_00001
group7: 3554-08 2010EL-1749_00001 3554-08_01855

并且想在ID之间添加一个逗号,如下所示

group1: 2010EL-1749,2010EL-1749_00001,3554-08,3554-08_01855,2010EL-1749_00002
group2: 2010EL-1749,2010EL-1749_00002,3554-08,3554-08_01856,2010EL-1749_00001
group7: 3554-08,2010EL-1749_00001,3554-08_01855

2 个答案:

答案 0 :(得分:2)

在AWK中,用逗号替换所有空格,然后将第一个逗号替换回空格:

awk 'gsub(/ /,",") && sub(/,/," ")' testfile

或使用gensub

awk '$0=gensub(/([^:]) /,"\\1,","g")' testfile

答案 1 :(得分:1)

$ sed 's/ /,/g; s/,/ /' textfile
group1: 2010EL-1749,2010EL-1749_00001,3554-08,3554-08_01855,2010EL-1749_00002
group2: 2010EL-1749,2010EL-1749_00002,3554-08,3554-08_01856,2010EL-1749_00001
group7: 3554-08,2010EL-1749_00001,3554-08_01855

这可以通过将所有空格更改为逗号来实现:s/ /,/g。然后它会将第一个逗号更改回空格:s/,/ /

s/,/ /替换命令的示例。表单为s/old/new/,其中old正则表达式old的第一个匹配项被new替换。如果我们在命令的末尾添加g,例如s/ /,/g,那么不仅仅会替换第一个:所有非重叠匹配都会被替换。

此方法假定没有ID包含空格,并且组名不包含逗号。

要更改文件:

sed -i.bak 's/ /,/g; s/,/ /' textfile

替代

正如评论中sp asic所建议的,如果我们可以假设所有ID都以数字结尾,那么:

sed 's/\([0-9]\) /\1,/g' textfile

或者,如果相反,我们可以假设只有组,而不是ID,以冒号结尾(帽子提示:詹姆斯布朗):

sed 's/\([^:]\) /\1,/g' testfile