首页 > 解决方案 > 如何在 awk 中打印记录的行号?

问题描述

我正在使用 awk 处理多行记录,其中每条记录的字段数是未知的。这是为了帮助过滤非常大的文件中的记录,因此了解返回记录的行号会很有帮助。我尝试为每条记录定一个变量,但这似乎很老套,有没有更好的方法来做到这一点?

数据示例(包括行号):

1 | data1 - good
2 |    foo bar
3 |
4 | data2 - bad
5 |    foo bar
6 |    pet cat
7 |    name snuggles
8 |
9 | data3 - good
10|    foo bar
11|    color blue

代码示例:

BEGIN {RS =""; FS="\n"; ORS="\n\n"; OFS=""; x=0}
{
  { x += NF + 1; }
  { if ($1 ~ /bad/) { next; } }
  { print "[", x - NF, "]\n", $0; }
}

我正在寻找的输出将是这样的:

[1]
data1 - good
    foo bar

[9]
data3 - good
    foo bar
    color blue

有没有更好的方法来做到这一点,我没有看到?

标签: awk

解决方案


总的来说,我认为你的方法很好,不会认为它是 hackey。

您可能会考虑进行一些小的调整以使其更简单:

BEGIN {RS =""; FS="\n"; ORS="\n\n"; OFS=""; x=1}
!($1 ~ /bad/) { print "[", x, "]\n", $0; }
{ x += NF + 1; }

推荐阅读