如何删除以最后一行结尾的字段分隔符?

如何删除以最后一行结尾的字段分隔符?

如何删除最后一行结尾的“,”字段分隔符?sed//逐一线性awkperl

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最后一个非逗号之前的所有内容(尽管会产生删除空行的副作用)。

或者使用 GNUawkmawk

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

这会将行末尾的所有逗号替换为空(它们将被删除)。

,,*$将匹配行尾的一个或多个逗号(字面意思是“一个逗号,然后零个或更多逗号”)。

另一种方法是纠正以下问题产生数据,以便它不会输出空字段。

相关内容