在unix sll脚本中计算具有行分隔符的文件行

时间:2014-12-30 08:13:08

标签: awk

DataFile内容

1234t56
78t7891

这里的分隔符是t

我需要输出

3 

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

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

但它在awk中的性能障碍可以帮助

3 个答案:

答案 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

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

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