我正在尝试编写一个shell
/ perl
命令,该命令将为我提供行号,其中字段数小于某个计数。
例如。我有一个逗号分隔的文本文件。我试图找到那些少于15个字段的行。所以我想问题本质上归结为返回少于14个逗号的行。
任何人都可以帮助我吗?
谢谢!
答案 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而不仅仅是“以逗号分隔”,那么您可以考虑使用Text::xSV或Text::CSV_XS - 不同之处在于CSV可以包含使用引用字段嵌入逗号,换行符和其他奇怪的东西。
答案 2 :(得分:2)
您还要求Perl。这不是唯一的方法,它假定逗号总是字段分隔符 -
perl -ne 'print "$.: $_" if 15 > split/,/' my-comma-file.txt