从字节偏移量中获取行号

use*_*890 12 utilities text-processing

具有文件的字节偏移量。

是否有提供此字节行号的工具?

  • 字节数从零开始,如:第一个字节是 0 而不是 1。
  • 行号以 1 开头。
  • 文件可以有纯文本、“二进制”blob、多字节字符等。但我感兴趣的部分:文件结尾,只有 ASCII。

示例,文件:

001
002
003  <<-- first zero on this line is byte 8
004
Run Code Online (Sandbox Code Playgroud)

有字节偏移8会给我行3

猜猜我可以使用这样的东西来查找行号:

 一种。tail -c+(offset + 1) file | wc -l,这里+1tail从1计数
 湾 wc -l file
 C。那么tail -n+num 这里numa - b + 1

但是......有没有一个相当常见的工具可以num直接给我?


编辑,错误:或更明显:

head -c+offset file | wc -l
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 16

在你的例子中,

001
002
003
004
Run Code Online (Sandbox Code Playgroud)

字节数 8 是第二个换行符,而不是0下一行。

以下将为您提供$b字节后的完整行数:

$ dd if=data.in bs=1 count="$b" | wc -l
Run Code Online (Sandbox Code Playgroud)

将报告2b设为8,将报告1b设置为7。

dd实用程序在这里使用的方式将从文件中data.in读取,并将读取$b大小为 1 字节的块。

正如“icarus”在下面的评论中正确指出的那样,使用bs=1效率低下。在这种特殊情况下,交换bs和更有效count

$ dd if=data.in bs="$b" count=1 | wc -l
Run Code Online (Sandbox Code Playgroud)

这将与第一个dd命令具有相同的效果,但只会读取一个$b字节块。

wc实用程序计算换行符,Unix 中的“行”总是以换行符结尾。所以上面的命令仍然会说2你是否设置b为低于 12 的任何值(以下换行符)。因此,您要查找的结果是上述管道报告的任何数字加上 1。

这显然也会计算文件的二进制 blob 部分中位于 ASCII 文本之前的随机换行符。如果您知道 ASCII 位从哪里开始,您可以添加skip="$offset"dd命令中, where$offset是要跳入文件的字节数。