Awk 打印前一行和匹配行

Awk 打印前一行和匹配行,awk,Awk,我想搜索模式,如果匹配,然后打印匹配的行和前一行。 我使用了密码 awk '/pattern/ {print a}{a=$0}' file 但它只打印匹配行的前一行。如何打印前一行和匹配行。在当前方法中,当图案匹配时,首先打印a,然后将其设置为当前行的值 这样做的效果是a始终具有前一行的值。如果匹配在第一行,您将打印一个空字符串,因为a还没有值 除了记住a中的当前行并在下一次迭代中打印外,还必须在模式匹配时打印当前行$0 awk '/pattern/ { if (a) print a

我想搜索模式,如果匹配,然后打印匹配的行和前一行。 我使用了密码

awk '/pattern/ {print a}{a=$0}' file

但它只打印匹配行的前一行。如何打印前一行和匹配行。

在当前方法中,当图案匹配时,首先打印
a
,然后将其设置为当前行的值

这样做的效果是
a
始终具有前一行的值。如果匹配在第一行,您将打印一个空字符串,因为a还没有值


除了记住
a
中的当前行并在下一次迭代中打印外,还必须在模式匹配时打印当前行
$0

awk '/pattern/ {
  if (a) print a
  print $0
}
{
  a=$0
}' file
如果a的值也可以是空字符串,或者按照注释中指出的数值计算为零,则可以从第二行开始打印
a

awk '
/regexp/ {
  if(FNR>1) { print a }
  print $0
}
{
  a=$0
}' file

您的路径是正确的,您忘记了打印当前行

awk '
/pattern/{
  if(prev)  { print prev ORS $0 }
  if(FNR==1){ print             }
  next
}
{
  prev=$0
}
' Input_file
我也注意到了第一行,如果图案出现在第一行,它会简单地打印这一行,因为没有前一行

说明:添加上述内容的详细说明

awk '                                 ##Starting awk program from here.
/pattern/{                            ##Checking for specific pattern here.
  if(prev)  { print prev ORS $0 }     ##Checking if prev is NOT NULL then print prev newline current line.
  if(FNR==1){ print             }     ##Checking if its first line then simply print the line.
  next                                ##next will skip all further statements from here.
}
{
  prev=$0                             ##Setting prev to current line here.
}
' Input_file                          ##Mentioning Input_file name here.
你很接近:

awk '/regexp/{print a $0}{a=$0 ORS}' file

请参阅,以后请记住在您的问题中包含示例输入/输出。

如果匹配在第一行,它应该怎么做?顺便说一句:使用变量,存储以前的$0,在循环结束时更新它,需要时打印。您为什么不使用
grep-B1模式
?您的问题是将“pattern”替换为“partial或full string或regexp”,不管您实际的意思是什么(请参阅)。还包括一个简洁、可测试的示例输入和预期输出。确保它涵盖了所有不明显和不重要的情况,例如输入的第一行上的regexp(如果是这样)匹配、连续两行上的regexp匹配、包含元字符的regexp和输入、输入的regexp部分匹配部分、输入中的空行和
0
行等。,等。如果前一行为空或数值计算为零,则该操作将失败。@EdMorton我明白了,你是对的。我想
如果(FNR>1){print a}
能解决这个问题吗?我想是的,没有一种情况会立即出现在我的脑海中,那对我来说不起作用。