如何计算文字行?


14

如何计算文本文件中的行数。例如:

command file.txt

注意,我只想计算非空行(不计算空格和制表符的行)吗?



4
这个问题的定义不是很明确:只有空格(空格和TAB)的行被认为是空的吗?
Rmano 2015年

亲密投票者:@Rmano澄清后,根据OP的评论对问题进行了编辑。所以,请不要投亲如不清楚
αғsнιη

2
@KasiyA尚不清楚。我不知道OP是否只想用空格(空格,制表符,\r)来计数sa行或跳过它们。当前用空格回答所有计数行,只跳过空白行。
terdon 2015年

@terdon OP不想计数的空白行(包括空行(\r\n),线与-只-标签和线条,与只-空间),并希望跳过它们,因为我觉得和答道根据我的理解。
αғsнιη

Answers:


11

上面的答案是正确的,但略有不同,您可以使用grep来简化代码,例如grep -vc '^$' file.txt

例如(A):file.txt

$grep -vc '^$' file.txt

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$2

例如(B):file.txt

$sed '/^$/d' file.txt | wc -l

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$4

注意结果是4!当我们只希望两个。但这也算在内容和评论之间的标签。

请注意,从0开始的计数和从1开始的计数与从grep到sed的计数不同,我记得要了解更多详细信息,请搜索grep或sed。


1
您的两个示例都将对空行进行计数,但是OP请求了一个命令来对所有内容进行计数,但对空行进行了计数
kos 2015年

2
其实我错了,这个sed选项实际上是正确的,但是那grep是不对的
kos 2015年

仅部分正确,我对答案不满意,请在修复后给我留言,以便我删除我的不赞成意见
kos 2015年

1
@kos我很确定,您注意到这个问题有多模糊?
amrx

2
@kos,首先您是对的,谢谢。我还没有睡超过36个小时,我想是该睡觉了!
amrx

12

尝试sed

sed '/^$/d' file.txt | wc -l

如果您有任何仅包含空格或制表符的行,并且您也想从计数中忽略它们:

sed '/^[[:blank:]]*$/d' file.txt | wc -l

3
我还会^\s*$考虑只包含制表符或空格的行。
Sylvain Pineau

@SylvainPineau:已添加..
heemayl 2015年

1
我同意从OP的问题尚不清楚,但是带有空格/制表符的文本可以更改预期的结果+1。
Sylvain Pineau

3

使用grep

grep -vc '^$' file  # or
grep -vc '^\s*$' file    

3

您可以使用:

grep -cve '^\s*$' file.txt

如果您需要执行此命令,只需将以下几行粘贴到您的计算机中,.bashrc然后重新启动您的Shell会话或打开一个新的终端:

count_lines()
{
    grep -cve '^\s*$' $1
}

例:

count_lines file.txt
42

2

awk 'NF{++count} END{print count}' file

说明:

NF指示字段的总数,因此这打印唯一的非空行,因为在非空白行NF是大于0和评估为真。因此,当awk发现非空行时,递增计数标志,并在末尾打印计数标志的最新值END{print count}


1

编辑:您可以将c选项添加到,grep而不是将所有内容通过管道发送到wc,有关更紧凑的版本,请参见@muru的答案


grep

grep -v '^$' file.txt | wc -l

0

Perl解决方案

Perl可以做到这一点。通常,计数行的工作方式如下:

$ perl -ne 'END{print $.}' input.txt                                                                                     

如果我们要排除所有空行,我们将执行以下操作:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             

假设我们有这样的输入文件

$ cat -n input.txt
     1  Cat; Dog; Squirrel
     2  ORGANISM Animalus terrus
     3  
     4  Sequence: ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
     5  

总共有5行,有2空行。我们拥有的命令将输出:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             
3

多文件改进

这对于单个文件效果很好。如果我们想让它在多个文件上运行,可以执行以下操作:

$ perl -ne '$c+=1 if not /^$|^\s+$/;printf("%d %s\n",$c,$ARGV) and $c=0 if eof' input.txt /etc/passwd                    
3 input.txt
52 /etc/passwd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.