用逗号替换最后六个空格

时间:2015-06-06 10:01:47

标签: bash awk sed

如何使用bash在每行的文本文件中用逗号替换最后六个空格?

我有:

$cat myfile 
foo bar foo 6 1 3 23 1 20
foo bar 6 1 2 18 1 15
foo 5 5 0 15 1 21

我想要的是:

$cat myfile
foo bar foo,6,1,3,23,1,20
foo bar,6,1,2,18,1,15
foo,5,5,0,15,1,21

任何帮助表示赞赏!谢谢!

3 个答案:

答案 0 :(得分:5)

看起来规则可能是用数字替换逗号之前的任何空格:

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

或者,按照您的规范(替换最后六个空格),您可以选择以下内容:

awk '{for(i=1; i<=NF; ++i)printf "%s%s", $i, (i<NF-6?FS:(i<NF?",":RS))}' file

这会遍历输入中的字段,打印每个字段后跟空格(FS),逗号或换行符(RS),具体取决于它与结尾的接近程度这条线。

答案 1 :(得分:1)

添加rev(反向)的更完整的sed可能是

rev myfile | sed 's/ /,/; s/ /,/; s/ /,/; s/ /,/; s/ /,/; s/ /,/' | rev
当然,如果需要,可以简化第一次出现的部分!

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -r ':a;s/(.*) /\1,/;x;s/^/x/;/^x{6}/{z;x;b};x;ba' file

这使用贪婪来找到一行上的最后一个空格,然后通过将一个计数器保留在保留空间中来跟踪所替换的空格数。