awk 仅在其他匹配之前的最后一条记录时打印匹配

awk 仅在其他匹配之前的最后一条记录时打印匹配

我想使用 awk 来打印某些模式的匹配,前提是它是某些常量文本之前的文件的最后一行。

例如,我只想打印“c”的值,仅当它是某些常量文本之前的最后一行时:

cat file.txt:
a=1
b=2
c=3
...constant text...

打印 3.

cat file.txt:
a=1
c=3
b=2
...constant text...

不要打印任何东西。

我怎么做..? awk 如何知道它是否是文件的最后一个数字?

答案1

我想使用 awk 来打印某些模式的匹配,前提是它是某些常量文本之前的文件的最后一行。

在这种情况下,请尝试以下操作:

awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file

例子

$ cat file1 
a=1
b=2
c=3
...constant text...
$ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file1
3
$ cat file2
a=1
c=3
b=2
...constant text...
$ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file2
$ 

怎么运行的

  • -F=

    这告诉awk我们用作=字段分隔符。这样,我们就可以将a=1或等字段的名称和值分开c=3

  • /constant text/ && name=="c"{print value}

    如果我们到达带有constant textand name(如上一行最后设置的) is 的行c,则打印value

  • name=$1;value=$2

    对于当前行,将第一个字段保存为name,第二个字段保存为value

答案2

如果您不介意使用 grep,它可以选择在匹配之前打印行。

选项是:-B num,--before-context=num

在你的情况下:

cat file.txt|grep -B 1 "constant text"|grep "c="|cut -f2 -d'='

解释 :

  1. 仅打印常量文本之前的行。
  2. 从输出中过滤所有 c 值。
  3. 使用“=”分隔符提取第二个字段。

答案3

一些谷歌搜索找到了迄今为​​止最好的答案,尽管我已经得到了答案:使用tac使它变得更简单......

tac file | awk 'NR==2{if ( $1=="c") print $2}'

行号是“常量文本”之后的一行。如果“常量文本”是一行 - NR==2.如果是两行 - NR==3.还没有决定常量文本应该是什么格式......

相关内容