Awk 根据另一行中的条件打印出特定行

Awk 根据另一行中的条件打印出特定行,awk,Awk,抱歉,如果这真的是基本的东西,但我只是从awk开始 因此,我有一个输入文件im管道到awk如下。格式永远不会更改(如下所示) 我试着列出所有年龄在40岁的人的名字 我可以这样找到他们 awk'$2==“40”{print$2}” 但是我不知道如何打印姓名,请尝试以下内容(我现在正在开车,所以无法测试) 说明:第一个条件检查^name如果一行从它开始,则将该行值存储在变量val中。然后在其他条件检查一行是否从年龄开始;然后检查uf行的第二个字段是否大于40,如果变量val,则打印值并将其置零。请尝

抱歉,如果这真的是基本的东西,但我只是从awk开始 因此,我有一个输入文件im管道到awk如下。格式永远不会更改(如下所示)

我试着列出所有年龄在40岁的人的名字

我可以这样找到他们 awk'$2==“40”{print$2}”


但是我不知道如何打印姓名,请尝试以下内容(我现在正在开车,所以无法测试)


说明:第一个条件检查
^name
如果一行从它开始,则将该行值存储在变量val中。然后在其他条件检查一行是否从年龄开始;然后检查uf行的第二个字段是否大于40,如果变量val,则打印值并将其置零。

请尝试以下操作(我现在正在驾驶,因此无法测试它)

awk -F':' '/^name/{name=$2} \
    /^age/{if ($NF==40)print name}' input_file

说明:第一个条件检查
^name
如果一行从它开始,则将该行值存储在变量val中。然后在其他条件检查一行是否从年龄开始;然后检查uf,确保行的第二个字段大于40,然后打印变量val的值并将其置零。

如果您不反对使用
grep
且格式始终相同:

awk -F':' '/^name/{name=$2} \
    /^age/{if ($NF==40)print name}' input_file
cat filename | grep -B2 "age: 40" | grep -oP "(?<=name: ).*"
Jim
frank

cat filename | grep-B2“年龄:40”| grep-oP”(?如果您不反对使用
grep
且格式始终相同:

cat filename | grep -B2 "age: 40" | grep -oP "(?<=name: ).*"
Jim
frank

cat filename | grep-B2“age:40”| grep-oP“(?使用
gnu awk
并将记录选择器设置为nothing可使其与块一起工作

awk -v RS="" '/age: 40/ {print $2}' file
Jim
frank
Suspestics和RavinderSingh13 post的一些较短的
awk
版本

awk '/^name/{n=$2} /^age/ && $NF==40 {print n}' file
awk '/^name/{n=$2} /^age: 40/ {print n}' file
Jim
frank
  • 如果行以
    name
    开头,请将名称存储在
    n
  • 如果行以
    age
    开头,并且age是
    40
    打印
    n

使用
gnu awk
并将记录选择器设置为“无”,使其与块一起工作

awk -v RS="" '/age: 40/ {print $2}' file
Jim
frank
Suspestics和RavinderSingh13 post的一些较短的
awk
版本

awk '/^name/{n=$2} /^age/ && $NF==40 {print n}' file
awk '/^name/{n=$2} /^age: 40/ {print n}' file
Jim
frank
  • 如果行以
    name
    开头,请将名称存储在
    n
  • 如果行以
    age
    开头,并且age是
    40
    打印
    n
    • Awk知道概念记录和字段

      文件在记录中拆分,其中连续记录由记录分隔符
      RS
      拆分。每个记录在字段中拆分,其中连续字段由字段分隔符
      FS
      拆分

      默认情况下,记录分隔符
      RS
      设置为字符(
      \n
      ),因此每条记录都是一行。记录分隔符具有以下定义:

      RS
      RS
      字符串值的第一个字符应为输入记录分隔符;默认情况下为a。如果
      RS
      包含多个字符,则结果未指定。如果
      RS
      为空,则记录由一个加上一个或多个空行、前导或尾随空行的序列分隔霍尔不会在输入的开始或结束处产生空记录
      ,并且a应始终是字段分隔符,无论
      FS
      的值是什么

      因此,使用您提供的文件格式,我们可以基于
      RS=”“
      定义记录

      因此,基于此,我们可以立即列出所有具有以下行的记录:
      age:40

      $ awk 'BEGIN{RS="";ORS="\n\n"}/age: 40/
      
      上面这一行有几个问题:

      • 如果我们有一个400岁的人,他将被列入名单,因为行
        /age:400/
        包含请求的行
      • 如果我们有一个打字错误的记录,上面写着
        age:40
        age:40
      • 如果我们的记录中有一行写着工资:40美元/分钟怎么办
      要解决这些问题中的大多数,使用记录中定义良好的字段并为每个记录构建键值对更容易:

      key       value
      ---------------
      name   => Jim
      gender => male
      age    => 40
      
      然后,我们可以使用它来选择请求的信息:

      $ awk 'BEGIN{RS="";FS="\n"}
             # build the record
             { delete rec; 
               for(i=1;i<=NF;++i) {
                  # find the first ":" and select key and value as substrings
                  j=index($i,":"); key=substr($i,1,j-1); value=substr($i,j+1)
                  # remove potential spaces from front and back
                  gsub(/(^[[:blank:]]*|[[:blank:]]$)/,key)
                  gsub(/(^[[:blank:]]*|[[:blank:]]$)/,value)
                  # store key-value pair
                  rec[key] = value
               }
             }
             # select requested information and print
             (rec["age"] == 40) { print rec["name"] }' file
      
      $awk'开始{RS=”“;FS=“\n”}
      #创造记录
      {删除rec;
      对于(i=1;iAwk知道概念记录和字段

      文件在记录中拆分,其中连续记录由记录分隔符
      RS
      拆分。每个记录在字段中拆分,其中连续字段由字段分隔符
      FS
      拆分

      默认情况下,记录分隔符
      RS
      设置为字符(
      \n
      ),因此每条记录都是一行。记录分隔符具有以下定义:

      RS
      RS
      字符串值的第一个字符应为输入记录分隔符;默认情况下为a。如果
      RS
      包含多个字符,则结果未指定。如果
      RS
      为空,则记录由一个加上一个或多个空行、前导或尾随空行的序列分隔霍尔不会在输入的开始或结束处产生空记录
      ,并且a应始终是字段分隔符,无论
      FS
      的值是什么

      因此,使用您提供的文件格式,我们可以基于
      RS=”“
      定义记录

      因此,基于此,我们可以立即列出所有具有以下行的记录:
      age:40

      $ awk 'BEGIN{RS="";ORS="\n\n"}/age: 40/
      
      上面这一行有几个问题:

      • 如果我们有一个400岁的人,他将被列入名单,因为行
        /age:400/
        包含请求的行
      • 如果我们有一个打字错误的记录,上面写着
        age:40
        age:40
      • 如果我们的记录中有一行写着工资:40美元/分钟怎么办
      要解决这些问题中的大多数,使用记录中定义良好的字段并为每个记录构建键值对更容易:

      key       value
      ---------------
      name   => Jim
      gender => male
      age    => 40
      
      然后,我们可以使用它来选择请求的信息:

      $ awk 'BEGIN{RS="";FS="\n"}
             # build the record
             { delete rec; 
               for(i=1;i<=NF;++i) {
                  # find the first ":" and select key and value as substrings
                  j=index($i,":"); key=substr($i,1,j-1); value=substr($i,j+1)
                  # remove potential spaces from front and back
                  gsub(/(^[[:blank:]]*|[[:blank:]]$)/,key)
                  gsub(/(^[[:blank:]]*|[[:blank:]]$)/,value)
                  # store key-value pair
                  rec[key] = value
               }
             }
             # select requested information and print
             (rec["age"] == 40) { print rec["name"] }' file
      
      $awk'开始{RS=”“;FS=“\n”}
      #建立rec