如何删除最后一行结尾的“,”字段分隔符?sed
//逐一线性awk
perl
csv 文件示例:
zoo.cfg,autopurge.purgeInterval,24,
zoo.cfg,autopurge.snapRetainCount,30,,,,
zoo.cfg,clientPort,2181,
zoo.cfg,dataDir,/var/hadoop/zookeeper,
zoo.cfg,initLimit,10,,
zoo.cfg,syncLimit,5,1,1,,
zoo.cfg,tickTime,2000,,,,,,,,,,
预期输出:
zoo.cfg,autopurge.purgeInterval,24
zoo.cfg,autopurge.snapRetainCount,30
zoo.cfg,clientPort,2181
zoo.cfg,dataDir,/var/hadoop/zookeeper
zoo.cfg,initLimit,10
zoo.cfg,syncLimit,5,1,1
zoo.cfg,tickTime,2000
- 目标 - 删除每行上不必要的结束字段分隔符“,”或“,,”或“,,,”等。
答案1
使用sed
:
sed 's/,*$//' infile
这将匹配每行末尾的零个或多个逗号。对于某些sed
实现,您可能会告诉sed
在末尾匹配一个或多个:
sed 's/,\+$//' infile
(便携式/标准等效项是,\{1,\}
,因此您也可以使用,,*
or,*
来执行相同的操作)。
或者与 GNUgrep
或兼容:
grep -o '.*[^,]'
这将仅打印-o
最后一个非逗号之前的所有内容(尽管会产生删除空行的副作用)。
或者使用 GNUawk
或mawk
:
awk '1' RS=',*\n' #or
awk '1' RS=',+\n'
这是定义右埃科德Seperator 作为,*\n
(零个逗号或,+\n
(一个或多个逗号)的正则表达式,直到\n
看到 ewline。
那里1
只有一个永远真实条件,它将导致打印记录并忽略RS。
或者在perl
:
perl -pe 's/,*$//' #or
perl -pe 's/,+$//'
答案2
$ sed 's/,,*$//' input
这会将行末尾的所有逗号替换为空(它们将被删除)。
,,*$
将匹配行尾的一个或多个逗号(字面意思是“一个逗号,然后零个或更多逗号”)。
另一种方法是纠正以下问题产生数据,以便它不会输出空字段。