如何查找某个char小于某个计数的行?

时间:2011-06-06 13:49:17

标签: perl bash shell

我正在尝试编写一个shell / perl命令,该命令将为我提供行号,其中字段数小于某个计数。 例如。我有一个逗号分隔的文本文件。我试图找到那些少于15个字段的行。所以我想问题本质上归结为返回少于14个逗号的行。

任何人都可以帮助我吗?

谢谢!

3 个答案:

答案 0 :(得分:5)

你可以通过调用awk轻松地在bash中完成此操作。这种脚本正是awk的设计目标。

awk -F, '{ if (NF < 15 ) print NR "," $0 }' fileToTest

-F,告诉awk分割逗号字符串上的每一行,而NF(Number_of_Fields)表示每行中分割的字段数。根据需要更改15值以帮助您验证文件。

如果字段被引号括起来,请不要忘记CSV文件可能在字段中嵌入了逗号,即

 fld1, "text for, fld2", fld3, fld4,....

解决问题非常困难使用标签字符来分隔字段(或者您可以确定不会出现在数据中的其他字符),然后在晚上轻松入睡; - )

我希望这会有所帮助。

答案 1 :(得分:4)

可爱版

perl -lne 'print if tr/,// < 14

tr/x//是一个Perl习惯用法,用于计算字符串中x es的数量。

更灵活的版本

perl -F, -lane 'print if @F < 15`

-a启用“autosplit mode”,-F将分隔符设置为逗号,-e中的代码表示如果少于15个字段则打印。如果您最终想要对字段的内容执行其他操作,这很好,因为它们已在@F中以逗号分割。

正确的CSV版本

如果您的数据真的是CSV而不仅仅是“以逗号分隔”,那么您可以考虑使用Text::xSVText::CSV_XS - 不同之处在于CSV可以包含使用引用字段嵌入逗号,换行符和其他奇怪的东西。

答案 2 :(得分:2)

您还要求Perl。这不是唯一的方法,它假定逗号总是字段分隔符 -

perl -ne 'print "$.: $_" if 15 > split/,/' my-comma-file.txt