换行符不计入字符数

时间:2013-09-14 18:15:24

标签: linux shell awk

我有以下代码,使用 awk 计算文件中的字符数。
但它不计算在$ wc file计算的换行符
文件:ABC

12345
12345
12345
12345
12345
 
awk命令:

$ awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++)c++}END{print "total chars:"c}' abc

这给了我o / p as

Total char:25

但如果我运行与wc abc相同的abc文件,它会将o / p作为30 characters
是否可以一次使用两个文件分隔符的任何建议???

3 个答案:

答案 0 :(得分:5)

这是基于@ Scrutinizer的解决方案,以显示一种方法来处理可能不会以换行符结尾的文件(使用GNU awk for RT)来解决@ konsolebox的问题:

gawk '{t+=length+(RT?1:0)} END{print t}' file

或者更有效率,正如@konsolebox所指出的那样:

gawk '{t+=length} END{print t+NR-(RT?0:1)}' file

容纳空文件:

gawk '{t+=length}END{print t+NR-(!RT&&NR?1:0)}'

答案 1 :(得分:3)

就像我在这个帖子中提到的那样:Multiple Field separator in awk script awk只能为正确的文本文件提供正确的结果,其中观察到最大行长度等限制,最后一行以换行符结束,而wc没有这个限制..

awk '{t+=length} END{print "Total chars: " NR+t}' file

wc无关紧要,只计算字符..

=== edit === 这可能有效:

awk '
  NR==FNR{
    m++
    next
  }
  {
    t+=length
  }
  m==FNR-1{
    RS="§"
  }
  END{
    print "Total chars: " FNR+t-1
  }
' file file

或一行:

awk 'NR==FNR{ m++; next } { t+=length } m==FNR-1{ RS="§" } END{ print "Total chars: " FNR+t-1 } ' file file

文件被读取两次以确定行数,然后在第二次传递时记录分隔符被更改..

答案 2 :(得分:2)

您的记录仍然与RS分开,因此5个换行符将从计数中排除。

为您的FS和RS使用另一个分隔符,并计算整个$ 0的长度:

awk 'BEGIN{FS=RS="\x1c"}{c+=length($0)}END{print "total chars:"c}' abc

输出:

total chars:30

请注意,使用"""\x00"会跳过最后一个字符。

按概念,它实际上与:

相同
awk 'BEGIN{FS=RS="\x1c"}END{print "total chars:" length($0)}' abc

假设该文件不包含任何\x1c。无论如何它仍然无效。如果有的话。