1

我有以下代码使用awk计算文件中的字符数。
但它不计算换行符,因为它在$ wc file
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 作为

Total char:25

但是如果我运行相同的 abc 文件,因为wc abc它给了我 o/p30 characters
任何建议我是否可以一次使用两个文件分隔符???

4

3 回答 3

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)}'
于 2013-09-15T14:25:04.350 回答
3

就像我在这个线程中指出的那样:awk 脚本中的多字段分隔符 awk只能为正确的文本文件提供正确的结果,其中观察到最大行长度等限制并且最后一行以换行符结尾,而 wc 没有这个限制..

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

wc不在乎,只会计算字符..

=== 编辑 === 这可能有效:

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

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

于 2013-09-15T07:43:38.560 回答
2

您的记录仍用 RS 分隔,因此 5 个换行符被排除在计数之外。

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

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

输出:

total chars:30

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

从概念上讲,它实际上与以下内容相同:

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

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

于 2013-09-14T18:20:02.860 回答