DataFile内容
1234t56
78t7891
这里的分隔符是t
我需要输出
3
(我想要计算的三个对象是1234
,56<newline>78
和7891
)
它与grep一起工作,即计算分隔符的出现,然后添加一个将给出否定。行
但它在awk中的性能障碍可以帮助
答案 0 :(得分:4)
更新问题的另一种方法
awk -vRS='t' 'END{print NR}' file
答案 1 :(得分:3)
这样的事情:
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}'
答案 2 :(得分:3)
假设t
是你的行分隔符,就像你的短语“计算分隔符的出现然后添加一个将给出行数”一样,一种方法是只需删除不是分隔符的所有字符,并计算其余字符:
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
这是否足够快,我不能说,因为你没有提供那里的要求。如果没有使用像大缓冲区这样的东西编写定制程序,我认为你不会比这样的管道获得更好的性能。
但是,无论如何,您应该使用自己的数据对任何可能的解决方案进行基准测试。优化的主要口号是:测量,不要猜测!