计算文件中的行数


64

我敢肯定有很多方法可以做到这一点:如何计算文本文件中的行数?

$ <cmd> file.txt
1020 lines

Answers:


98

标准方法是with wc,它采用参数指定应计数的内容(字节,字符,单词等);-l用于行:

$ wc -l file.txt
1020 file.txt

如果要忽略注释,如何计算文件中的行数?具体来说,我想没有数以+开头的行,一些空白(可能是没有空格),然后%,这是注释行出现在MATLAB文件的git的差异的方式。我尝试使用grep进行此操作,但是找不到正确的正则表达式。
Gdalya

@Gdalya我希望下面的管道将做到这一点(没有测试perfomed) cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l/regexp/d删除匹配的行regexp,并为-e启用适当的(IMNSHO)语法regexp
dbanet

2
为什么不简单grep -v '^+ *%' matlab.git.diff | wc -l
celtschk 2014年

@celtschk,只要这在注释行中很常见:是否可以修改您的grep命令以将其视为注释情况" + Hello"(例如,请注意之前的空格+)?
Sopalajo de Arrierez,2015年

1
@SopalajodeArrierez:当然有可能:(grep -v '^ *+' matlab.git.diff | wc -l我假设引号实际上并不是行的一部分;我还假设行前面带有空格和没有空格的两行都+应该是注释;如果在至少一个空间是强制性的,无论是更换明星*\+,或者只是在恒星前面添加一个空格)。您可能想匹配任意空格,而不是仅匹配空格。为此,请用替换空格[[:space:]]。请注意,%由于您的示例中没有此内容,因此我也删除了与匹配的内容。
celtschk 2015年

15

正如迈克尔所说,wc -l是要走的路。但是,以防万一您莫名其妙地拥有bashperlawk但不是wc,这里有更多解决方案:

仅重击

$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT

Perl解决方案

$ perl -lne 'END { print $. }' file.txt

而且可读性差得多:

$ perl -lne '}{ print $.' file.txt

Awk解决方案

$  awk 'END {print NR}' file.txt

15

史蒂文·D(Steven D)忘记了GNU sed

sed -n '$=' file.txt

另外,如果您希望在不输出文件名的情况下进行计数,则可以使用wc

wc -l < file.txt

只是为了它:

cat -n file.txt | tail -n 1 | cut -f1

2
grep -c '',或tr -dc '\n' | wc -c,或nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'...除了wc -l纯(ba)sh 之外,它们中的任何一个本身是否有用(与构建程序所基于的东西相比,行数更多)?
吉尔斯(Gilles)2010年

1
@吉尔斯:我认为问题中的“许多方式”一词引发了我和史蒂夫的挑战。
丹尼斯·威廉姆森

1
@吉尔斯:sed 's/.*//' file.txt | uniq -c
丹尼斯·威廉姆森

2
@吉尔斯:哦,你的意思是第一个uniq -c -w 0 file.txt而且您只能cut -c -7保留该号码。或者,更POSIXly :uniq -c file.txt | awk '{c+=$1}END{print c}'。怎么样dc(即使它不是POSIX)?uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -bc是POSIX: uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc。如果您假设行长有限,则简单的答案:uniq -c -f 100000 file.txt
丹尼斯·威廉姆森

1
@JosipRodin:添加了引号
Dennis Williamson

11

使用时的警告语

wc -l

因为wc -l通过计数\ n起作用,所以如果文件的最后一行未有效地以换行符结尾,则行数将被减1.(因此,旧的约定在文件末尾保留了换行符)

由于我无法确定是否有任何给定的文件遵循是否以换行符结束最后一行的约定,因此我建议使用这些替代命令中的任何一个,无论是否使用换行符,它们都将在计数中包括最后一行。

sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename

不错的总结。欢迎使用Unix和Linux
Sebastian 2014年

嗯,最后一块真的是线吗?
gena2x 2014年

1
我确定这取决于每个人的用例;因为“最后一块”通常是某行没有有人换行的文本。我最经常遇到的用例是一个文件,该文件的文本字符串不以换行符结尾。wc -l会将其计为“ 0”,否则我希望计数为“ 1”。
pretzels1337

3

如果您只有bash而绝对没有可用的外部工具,则还可以执行以下操作:

count=0
while read
do
  ((count=$count+1))
done <file.txt
echo $count

说明:循环逐行读取标准输入(read;因为无论如何我们对读取的输入不执行任何操作,因此未提供任何变量来存储它),并count每次都增加变量。由于重定向(<file.txt在之后done),因此循环的标准输入来自file.txt


2

您始终可以grep如下使用命令:

grep -c "^" file.txt

它将计算的所有实际行file.txt,无论最后一行的末尾是否包含LF字符。

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.