我有一个包含以下内容的文件。
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}
任何内容替换为。这里,我们替换最后一个逗号后的所有内容,因此如果每行有多个逗号,则此方法不起作用,foo
var
bar
它只适用于你的例子. 其他解决方案不存在任何这些限制。
答案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 == ''])+','
连接分割的部分,在末尾添加逗号。