如果文本中的数字不连续,如何添加一些符号(或仅添加换行符)

yen*_*yen 7 linux grep sed awk text-processing

前任:

输入文件

A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
A_D2<6>
A<9>
A_D2<10>
A<13>
Run Code Online (Sandbox Code Playgroud)

期望输出:

A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
-----
A_D2<6>
-----
-----
A<9>
A_D2<10>
-----
-----
A<13>
Run Code Online (Sandbox Code Playgroud)

只关心尖括号中的数字。

如果数字不连续,则添加一些符号(或仅添加换行符)直到数字继续。

在这种情况下,缺少数字 5、7、8、11 和 12。

任何人都可以通过使用 awk 或 sed(甚至是 grep)命令来解决这个问题吗?

我是 Linux 的初学者。请解释整个命令行的细节。

Kus*_*nda 11

不建议使用grepsed来执行此操作,因为grep无法计数并且在其中进行任何类型的算术运算sed非常困难(它必须是基于正则表达式的计数,对于大多数人来说,除了专用的之外,这不是初学者)。

$ awk -F '[<>]' '{ while ($2 >= ++nr) print "---"; print }' file
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
---
A_D2<6>
---
---
A<9>
A_D2<10>
---
---
A<13>
Run Code Online (Sandbox Code Playgroud)

awk代码假定0应该是第一号,然后保持希望在变量的当前行的行号nr。如果从需要插入一行或几行的输入中读取一个数字,这由while循环完成(它也会增加nr变量)。

输入的数字<...>通过指定它被解析出来,<并且>应该用作字段分隔符。然后数字在$2(第二个字段)中。