确保每行末尾都有一个字符

确保每行末尾都有一个字符

我有一个包含以下内容的文件。

This
is,
are,,,
a,,

我想用单个逗号替换行尾。如果行尾没有逗号,则添加一个逗号;如果有多个逗号,则用单个逗号替换。

输出看起来像这样

This,
is,
are,
a,

答案1

最简单的方法是使用sed就地编辑:

sed -i 's/,*$/,/' file

-i对同一文件进行更改。您可以使用创建i.bak原始file.bak文件的备份文件。您也可以在不带 的情况下运行它,-i以便在应用更改之前查看更改。s/foo/bar/是替换运算符。它将用 替换第一个。标记foo行尾,表示“0 个或更多”。因此,表示“用一个逗号替换行尾的 0 个或更多逗号”。如果没有逗号,则会添加一个,如果有多个逗号,则会用一个逗号替换它们。bar$*s/,*$/,/

为了完整起见,还有一些其他选项:

  • Perl

    perl -i -pe  's/,*$/,/' file
    

    与上面的想法相同sed。这就是sed这个-i想法的来源。

    如果速度是一个问题,那么这个将是所有解决方案中最快的:

    perl -i -lne 'printf join ",", (grep {$_ ne ""}split(/,/) ); print ","' file
    
  • awk

    awk '{sub(/,*$/,",")}1;' file >newfile
    

    或者,使用较新版本的 (g)awk:

    awk -iinplace '{sub(/,*$/,",")}1;' file
    
  • 纯 shell(速度较慢且效率较低,仅作为示例):

    while read line; do echo "${line/%,*/},"; done < file > newfile
    

    会将变量末尾的${var/%foo/bar}任何内容替换为。这里,我们替换最后一个逗号后的所有内容,因此如果每行有多个逗号,则此方法不起作用,foovarbar它只适用于你的例子. 其他解决方案不存在任何这些限制。

答案2

如果中间可能有逗号

比处理较小文件时的速度慢sed,但是快点在更大的文件上(在 10MB 上测试),是下面的 python 选项。

另外,如果有可能性在行中的其他地方不使用逗号,下面的长单行代码就可以起作用:

python3 -c "ls = open('file').read().splitlines(); [print( (',').join([s for s in l.split(',') if not s == ''])+',') for l in ls]"

或者更短一点:

python3 -c "[print( (',').join([s for s in l.split(',') if not s == ''])+',') for l in open('f').read().splitlines()]"

...其中,'file'是文件的绝对路径,位于(单!)引号之间。

例子

在文件上:

something like, for example this
here, read this line, I added some commas,,,,,,,,
are, you convinced or not,
just say something, anything

...输出是:

something like, for example this,
here, read this line, I added some commas,
are, you convinced or not,
just say something, anything,

解释

ls = open('file').read().splitlines()

读取文件,将其分成几行

[s for s in l.split(',') if not s == '']

按分隔符拆分行,,删除行尾的(可能的)逗号

(',').join([s for s in l.split(',') if not s == ''])+','

连接分割的部分,在末尾添加逗号。

相关内容