perl行删除值小于x

时间:2015-10-29 20:01:53

标签: bash perl

我的csv文件在第3列中有数值。我不想要任何这个值小于604800的行。以下perl行位于我的bash脚本中,用于创建和编辑此文件。这条线工作正常,但在第3列留下约20行和0值,我不知道为什么。它会删除所有其他类似的行。有人能告诉我为什么它缺少这些线条或提供更好的解决方案。

perl -ne 'print if grep {$_>604800} /(\d{6,})/' ./temp/mergedreport.csv > ./temp/mergedreport1.csv

3 个答案:

答案 0 :(得分:3)

你可能想要:

perl -ne 'print if /(\d{6,})/ and $1 > 604_800'

您还可以利用Perl的自动分割模式(-a),它将行分为多列:

perl -ane 'print if $F[2] > 604_800'

以上假设您的列以空格分隔;您可以使用-F选项指定备用分隔符。但是,如果它是真正的CSV文件,您可能应该使用Text::CSVParse::CSV之类的内容。

此处grep是多余的,因为您的语句在while (<>) { .. }循环内运行(感谢-n),因此您只需要一次担心一行。 (除非您尝试在一行上处理多个数字,在这种情况下,您绝对应该使用-F或CPAN中的一个CSV模块。)

答案 1 :(得分:0)

要求救援!

awk '$3>604800' file

如果使用分隔符逗号,则需要添加-F,选项

答案 2 :(得分:0)

如果您能够显示数据,尤其是正在打印的不需要的行

,那将会有很大帮助

问题很可能是你的零只是一个数字0,而你的正则表达式正在寻找它可以在行中找到的第一个六位数字。如果在第三列之后发现大于604800的某个那么该行将被打印

如果您的CSV确实以逗号分隔,那么您可以通过编写

明确检查第三列
perl -lne 'print if (split /,/)[2] >= 604_800' ./temp/mergedreport.csv

如果它是以制表符分隔的,那么它应该是(split /\t/)[2],如果它通常只是以空格分隔,那么(split)[2]