【问题标题】:Bash script to count CR/LF in a text file用于计算文本文件中的 CR/LF 的 Bash 脚本
【发布时间】:2014-12-15 18:59:23
【问题描述】:

我已经阅读了许多 awk 和 sed 衬里来尝试执行我需要的东西,但似乎没有一个有效。我要做的只是计算我的 Linux 文件中 CR/LF 中断的数量。这个文件也有普通的 LF 换行符,我只需要知道我导入了多少真实记录。

我尝试过的一个这样的 awk 行是 awk '/^M$/{n++}; END { print n+0 }' my_file 或类似的。这没有用。任何帮助都会很棒。我不是 awk 大师,所以请放轻松。

【问题讨论】:

  • @anubhava 我认为该文件是 CRLF 和 LF 的混合体,而不是 CRLF?
  • “真实”记录是单独由 LF 分隔,还是由 CRLF 分隔,还是由两者分隔?

标签: linux bash shell awk


【解决方案1】:

使用支持多字符记录分隔符的 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 个。但是,只有两个换行符。

【讨论】:

  • 当您的文件中只有 2 个 CRLF 时,您的示例输出为 3(最后一行由 LF 终止,由 echo 插入)
  • @ComputerDruid 我想这取决于 OP 是否有兴趣计算字符数或计算记录数。
  • 按照惯例,文件末尾应有换行符。如果末尾没有换行符,即使 wc -l 也不会计算最后一行。见stackoverflow.com/a/7741505/276093
【解决方案2】:

您可以使用这个grep 来计算所有以CR/LF 结尾的行:

grep -c $'\r$' file

模式$'\r$' 将仅匹配以\r\n 结尾的行,-c 将为您提供这些行的计数。

【讨论】:

  • 这为我的答案中包含 3 条记录的示例文件输出 2。
  • 是的,awk 命令确实提供了一个额外的计数,即3,但您可以看到样本中只有两行以\r\n 结尾。
【解决方案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

它是DOS换行数,Unix换行数,Mac换行数,字节顺序标记,文本或二进制,文件名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多