【发布时间】:2014-12-31 17:31:56
【问题描述】:
数据文件内容
1234t56
78t7891
这里的分隔符是t
我需要输出为
3
(我要计算的三个对象是1234、56<newline>78 和7891)
它与 grep 一起使用,即计算分隔符的出现然后添加一个将给出否。行数
但它的性能障碍 awk 中的任何东西都可以提供帮助
【问题讨论】:
标签: awk
数据文件内容
1234t56
78t7891
这里的分隔符是t
我需要输出为
3
(我要计算的三个对象是1234、56<newline>78 和7891)
它与 grep 一起使用,即计算分隔符的出现然后添加一个将给出否。行数
但它的性能障碍 awk 中的任何东西都可以提供帮助
【问题讨论】:
标签: awk
更新问题的另一种 awk 方式
awk -vRS='t' 'END{print NR}' file
【讨论】:
类似这样的:
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}'
【讨论】:
假设 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
这是否足够快,我不能说,因为你还没有提供那里的要求。如果没有使用大型缓冲区之类的东西编写定制程序,我认为您不会获得比这样的管道更好的性能。
但是,无论如何,您也应该使用自己的数据对任何潜在的解决方案进行基准测试。优化的主要口号是:衡量,不要猜测!
【讨论】: