【问题标题】:Counting Lines of file having row delimiters in unix sll script在 unix sll 脚本中计算具有行分隔符的文件行数
【发布时间】:2014-12-31 17:31:56
【问题描述】:

数据文件内容

1234t56
78t7891

这里的分隔符是t

我需要输出为

3 

(我要计算的三个对象是123456<newline>787891

它与 grep 一起使用,即计算分隔符的出现然后添加一个将给出否。行数

但它的性能障碍 awk 中的任何东西都可以提供帮助

【问题讨论】:

    标签: awk


    【解决方案1】:

    更新问题的另一种 awk 方式

    awk -vRS='t' 'END{print NR}' file
    

    【讨论】:

      【解决方案2】:

      类似这样的:

      echo "1234t5678t7891" | awk -F't' '{print NF}'
      

      如果处理文件内容,你可以将其更改为:

      awk -F't' '{print NF}' File
      

      在这里,我们将分隔符设置为't' (-F't')。然后我们打印字段数(print NF)

      对于您编辑的问题:

      tr -d '\n' < File | awk -F't' '{print NF}'
      

      【讨论】:

      • 这可能很难将大文件(被视为单行)放入列中。
      • 如果有任何性能问题,你可以尝试和 c... 不幸的是,我无法预测行为.. 如果其他人可以提供更好的输入,请让 c..
      【解决方案3】:

      假设 t 是您的 line 定界符,就像您的短语“计算定界符的出现然后添加一个将给出行数”的情况一样,一种方法是简单地删除不是分隔符的所有字符并计算剩余的字符:

      pax> ((count = $(echo '1234t5678t7891' | tr -c -d 't' | wc -c)))
      pax> ((count++))
      pax> echo $count
      3
      

      对于一个我碰巧放在身边的 3.5G 文件,这大约需要 24 秒的挂墙时间,但 CPU 时间只有大约 6 秒:

      pax> ll qq2
      -rw-r--r-- 1 pax good_lookers 3541710600 Dec 30 16:32 qq2
      
      pax> time ((count = $(tr -c -d 't' <qq2 | wc -c)))
      real    0m24.163s
      user    0m4.436s
      sys     0m2.060s
      
      pax> ((count++)) ; echo $count
      10844976
      

      这是否足够快,我不能说,因为你还没有提供那里的要求。如果没有使用大型缓冲区之类的东西编写定制程序,我认为您不会获得比这样的管道更好的性能。

      但是,无论如何,您也应该使用自己的数据对任何潜在的解决方案进行基准测试。优化的主要口号是:衡量,不要猜测!

      【讨论】:

      • 感谢您的解决方案,但我的数据文件在 gigs 中
      • @Nishad,我已经为 G 范围内的文件提供了一些示例时序,但您应该根据自己的数据对其进行测试。
      • 刚刚做了一些测试,这是迄今为止我能找到的最快的解决方案,干得好+1。
      猜你喜欢
      • 2014-12-07
      • 2010-10-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多