我的csv文件在第3列中有数值。我不想要任何这个值小于604800
的行。以下perl行位于我的bash脚本中,用于创建和编辑此文件。这条线工作正常,但在第3列留下约20行和0值,我不知道为什么。它会删除所有其他类似的行。有人能告诉我为什么它缺少这些线条或提供更好的解决方案。
perl -ne 'print if grep {$_>604800} /(\d{6,})/' ./temp/mergedreport.csv > ./temp/mergedreport1.csv
答案 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::CSV或Parse::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]