如何在awk中打印记录的行号?

如何在awk中打印记录的行号?,awk,Awk,我使用awk处理多行记录,其中每条记录的字段数未知。这有助于过滤非常大的文件中的记录,因此了解返回记录的行号会很有帮助。我试图为每一条记录证明一个变量有罪,但这似乎有点老套,有更好的方法吗 数据示例(包括行号): 代码示例: BEGIN {RS =""; FS="\n"; ORS="\n\n"; OFS=""; x=0} { { x += NF + 1; } { if ($1 ~ /bad/) { next; } } { print "[", x - NF, "]\n", $0; }

我使用awk处理多行记录,其中每条记录的字段数未知。这有助于过滤非常大的文件中的记录,因此了解返回记录的行号会很有帮助。我试图为每一条记录证明一个变量有罪,但这似乎有点老套,有更好的方法吗

数据示例(包括行号):

代码示例:

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 '
/data[0-9]+/{
  flag=$NF=="bad"?"":1
  count=""
}
flag && NF>2{
  if(++count==1){
    print "["$1"]"
    sub(/.*\| /,"")
  }
  sub(/.*\|/,"")
  print
}'   Input_file

一般来说,我认为你的方法是好的,不会认为它是哈基。

你可以考虑一些小的调整,使它稍微简单一点:

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

虽然我可能会将您的方法调整为:

$ cat tst.awk
BEGIN { RS=""; ORS="\n\n"; FS="\n" }
{
    nr += prevNf + 1
    if ($1 ~ /good/) {
        print "[" nr "]\n" $0
    }
    prevNf = NF
}

$ awk -f tst.awk file
[1]
data1 - good
   foo bar

[9]
data3 - good
   foo bar
   color blue
但这里有一个替代方案:

$ cat tst.awk
!NF { prt(); next }
{
    nrs[++numLines] = NR
    rec[numLines]   = $0
}
END { prt() }

function prt(   lineNr) {
    if (rec[1] ~ /good/) {
        printf "[%d]\n", nrs[1]
        for (lineNr=1; lineNr<=numLines; lineNr++) {
            print rec[lineNr]
        }
        print ""
    }
    delete rec
    numLines = 0
}

$ awk -f tst.awk file
[1]
data1 - good
   foo bar

[9]
data3 - good
   foo bar
   color blue
$cat tst.awk
!NF{prt();next}
{
nrs[++numLines]=NR
记录[numLines]=0美元
}
结束{prt()}
功能prt(线路编号){
if(rec[1]~/good/){
printf“[%d]\n”,nrs[1]

对于(lineNr=1;lineNr,如果Perl是一个选项,您可以在下面进行尝试

$ cat caffein.txt
data1 - good
   foo bar

data2 - bad
   foo bar
   pet cat
   name snuggles

data3 - good
   foo bar
   color blue

$ perl -0777 -ne ' s/^/++$x." "/mge; while(/(^\d+)(\s*data.+?good.+?)(\n\d+\s+\n\d+\s+|\Z)/gms) { $x="[$1] $2\n\n";$x=~s/^\d+/ /mg; print $x } ' caffein.txt
[1]  data1 - good
     foo bar

[9]  data3 - good
     foo bar
     color blue


$
或因与“坏”不匹配而具有负前瞻性

$ cat caffein.txt
data1 - good
   foo bar

data2 - bad
   foo bar
   pet cat
   name snuggles

data3 - good
   foo bar
   color blue

$ perl -0777 -ne ' s/^/++$x." "/mge; while(/(^\d+)(\s*data.+?good.+?)(\n\d+\s+\n\d+\s+|\Z)/gms) { $x="[$1] $2\n\n";$x=~s/^\d+/ /mg; print $x } ' caffein.txt
[1]  data1 - good
     foo bar

[9]  data3 - good
     foo bar
     color blue


$
$ perl -0777 -ne ' s/^/++$x." "/mge; while(/(^\d+)(\s*data.+?(?!bad).+?)(\n\d+\s+\n\d+\s+|\Z)/gms) { $x="[$1] $2\n\n";$x=~s/^\d+/ /mg; print $x } ' caffein.txt