一个用于统计文本文件中CR/LF数量的Bash脚本

4
我已阅读多个awk和sed命令行的内容,以尝试完成我所需的任务,但似乎都不起作用。我要做的只是计算Linux文件中CR/LF断点的数量。该文件还有普通的LF换行符,我只需要知道正在导入多少条真实的记录。
我尝试了以下一个awk命令行: awk '/^M$/{n++}; END { print n+0 }' my_file 等等。这并没有奏效。希望能得到帮助。我不是awk专家,请讲解得易懂。

3
我认为这个文件是CRLF和LF的混合,而不仅仅是CRLF? - Martin Tournoij
1
一个“真实”的记录是仅由LF,仅由CRLF还是由两者都分隔的? - Mike Sherrill 'Cat Recall'
3个回答

8
使用支持多字符记录分隔符的GNU awk:
awk -v RS='\r\n' 'END{print NR}' file

这将记录分隔符设置为 \r\n 并打印记录总数。

例如:

$ echo $'record 1\r\nrecord\n2\r\nrecord 3' > file
$ awk -v RS='\r\n' 'END{print NR}' file
3

对于那些认为这个答案是错误的人,让我提出另一个例子。考虑这个文件:

bash-4.2$ cat -vet file
line 1$
line 2$
line 3bash-4.2$

(保留shell提示以显示文件结尾)

使用常规UNIX行结尾并且文件末尾没有换行符。这个文件中有多少条记录?个人认为有3条记录。然而,只有两个换行符。


1
你的样本输出显示有3个CRLF,但实际上文件中只有2个(最后一行以LF结尾,由echo插入)。 - ComputerDruid
1
@ComputerDruid 我猜这取决于原帖作者是想要计算字符还是记录数。 - Tom Fenech
按照惯例,在文件末尾应该有一个换行符。即使使用 wc -l 命令计算行数,如果末尾没有换行符,最后一行也不会被计算在内。请参考 https://dev59.com/b3RB5IYBdhLWcg3wET1J#7741505。 - matt burns

6
您可以使用此grep命令来计算所有以CR/LF结尾的行数:
grep -c $'\r$' file

模式$'\r$'只匹配以\r\n结尾的行,-c将给您计算这些行的数量。


1
这将输出2,对于我的答案中包含3条记录的示例文件。 - Tom Fenech
确实,awk命令会多计算一次,即3,但是在你的示例中只能看到2行以\r\n结尾。 - anubhava

3

现代dos2unix实用程序能够计算CR/LF行的数量:

示例输出:

$ dos2unix -i *.txt
 6       0       0  no_bom    text    dos.txt
 0       6       0  no_bom    text    unix.txt
 0       0       6  no_bom    text    mac.txt
 6       6       6  no_bom    text    mixed.txt
50       0       0  UTF-16LE  text    utf16le.txt
 0      50       0  no_bom    text    utf8unix.txt
50       0       0  UTF-8     text    utf8dos.txt
 2     418     219  no_bom    binary  dos2unix.exe

这是关于IT技术的内容,涉及以下要素:DOS换行符数量、Unix换行符数量、Mac换行符数量、字节序标记、文本或二进制文件类型、文件名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接