2015-08-09 20 views
-1

我有这种格式的制表符分隔的柱状.txt文件:查找零个值,并用空格替换/删除它们 - Perl的

61200 285700 22000 
61600 294000 22300 
64400 385200 22500 
66100 427600 24000 
70700 478500 24400 
72300 0  24700 
72700 0  24800 
78600 0  25200 
79900 0  25300 
83600 0  26100 
84700 0  26300 
86900 0  26600 
88300 0  27000 
91000 0  27200 
91900 0  27400 
92700 0  27500 

而且我想找到所有的“0”值(不含尾随零)并删除它们,或用空格替换它们。

所需的输出:

61200 285700 22000 
61600 294000 22300 
64400 385200 22500 
66100 427600 24000 
70700 478500 24400 
72300   24700 
72700   24800 
78600   25200 
79900   25300 
83600   26100 
84700   26300 
86900   26600 
88300   27000 
91000   27200 
91900   27400 
92700   27500 

什么是这样做可以不断扩展的最有效的方法?我将批量处理大量的.txt文件 - 每个文件大于50Mb。

回答

4

简单,使用字边界\b之前和之后0\b匹配单词字符和非单词字符(反之亦然)。

perl -pe 's/\b0\b/ /g' file 

添加-i参数进行就地编辑。

perl -i -pe 's/\b0\b/ /g' file 
+0

该OP说数字是制表符分隔..所以也许'\ b'不需要? –

+0

但是没有'\ b',它会匹配所有的零。 –

+0

我只是想''b''也匹配空格分隔的零......但可能对OP的问题无关紧要 –

1

您可以使用这样的正则表达式:

/^(\d+)\t+((0)|(\d+))\t+(\d+)$/gm 

,并使用其替代这样的:

\1\t\4\t\5 

[Regex Demo]

1

如果你有文件的一个巨大的名单批处理这是更高效的:

perl -pe 's/\t0\t/\t \t/' blah 

我想,因为perl正在寻找所有的边界字符,而不是只有制表符。

[email protected]:~$ ls -lh blah && time perl -pe 's/\b0\b/ /' blah >/dev/null && time perl -pe 's/\t0\t/\t \t/' blah >/dev/null 
-rw-r--r-- 1 marshall marshall 53M Aug 9 22:03 blah 

real 0m4.077s 
user 0m4.048s 
sys 0m0.028s 

real 0m2.765s 
user 0m2.752s 
sys 0m0.012s 
相关问题