【问题标题】:How to find rows which has a certain char less than a certain count?如何找到某个字符小于某个计数的行?
【发布时间】:2011-06-06 13:49:17
【问题描述】:

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

谁能帮我解决这个问题?

谢谢!

【问题讨论】:

    标签: perl bash shell


    【解决方案1】:

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

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

    -F, 告诉 awk 在逗号字符上分割每一行,并且NF (Number_of_Fields) 指示在每一行中分割多少个字段。根据需要更改 15 值以帮助您验证文件。

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

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

    解决这个问题要困难得多 使用制表符分隔您的字段(或您可以确定永远不会出现在您的数据中的其他字符),然后在晚上轻松入睡 ;-)

    我希望这会有所帮助。

    【讨论】:

    • @shelter:非常感谢您的快速回复。但我猜在“if”条件下,符号应该是“”,因为我想要字段小于 15 的行。
    • 另外,我怎样才能得到行号?
    • 在输出中添加了 NR (Number_of_Record)(行号),用逗号分隔。
    • 找到它:awk -F, 'BEGIN {x=1}; { if (NF &lt; 65 ) print x,$0; x++}' my-comma-file.txt
    • 可以写出更多的 awk 风格:awk -F, 'NF&lt;15 {print NR, $0}'
    【解决方案2】:

    可爱版

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

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

    更灵活的版本

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

    -a 启用“自动拆分模式”,-F 将分隔符设置为逗号,-e 中的代码表示如果字段少于 15 个则打印。如果您最终想对字段的内容做其他事情,这很好,因为它们在 @F 中可用,已经用逗号分隔。

    正确的 CSV 版本

    不是一个很好的单行,但如果您的数据真的是 CSV 而不仅仅是“逗号分隔”,您可以考虑使用 Text::xSVText::CSV_XS — 不同之处在于 CSV 可以包含嵌入的逗号、换行符, 和其他奇怪的东西通过使用带引号的字段。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 为了更接近地匹配awkperl -F, -ne 'print "$.: $_" if 15 &gt; @F'
      • 第一个刺缺少-a 开关,我认为:perl -aF, -ne 'print "$.: $_" if 15 &gt; @F'(@hobbs,你太快了!)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 2014-12-20
      • 1970-01-01
      • 2021-12-01
      • 2018-06-27
      • 2019-07-19
      相关资源
      最近更新 更多