从文件中提取具有特定第 n(第二)列值的行的第 m(第一)列值

5 sed awk text-processing

我需要编写一个awk命令,该命令将从下表中仅返回标题为 的行的标识号Turtle。该表存储在turtle.txt

Id Num. Title           CatchDate
433417  RedTurtle       2001-06-29
493303  BlueTurtle      1998-09-20
259497  Turtle          1985-05-08
229505  RedTurtle       1994-07-13
473076  OrangeTurtle    2002-03-08
221907  Blueturtle      1999-07-02
457032  Turtle          1993-04-09
490359  RedTurtle       1996-11-12
494595  SnappingTurtle  1985-05-20
402421  BlueTurtle      1999-08-16
Run Code Online (Sandbox Code Playgroud)

ImH*_*ere 5

使用 awk:

$ awk '$2 == "Turtle" {print $1}' turtle.txt
259497
457032
Run Code Online (Sandbox Code Playgroud)
  • $2 是要选择的字段。
  • Turtle 是要匹配的文本。
  • {print $1} 是打印第一个字段。
  • turtle.txt 是源文件的名称。

使用 sed:

$ <infile sed -E 's/[[:blank:]]+/\n/g;/([^\n]+\n){1}Turtle/([^\n]*).*/\1/;p};d'
Run Code Online (Sandbox Code Playgroud)

解释:

  • <infile 源文件
  • sed -E 将 sed 与 POSIX ERE(扩展正则表达式)一起使用
  • 's/[[:blank:]]+/\n/g+新行替换所有(运行)制表符空间。
  • /([^\n]+\n){1}Turtle\n/如果字段nn-1在此处使用)匹配Turtle(完全匹配)。
  • ([^\n]*).*/\1/ 提取字段 1(第一行)
  • p};d' 打印选择的内容并在任何情况下删除所有内容。

任何一对字段的通用解决方案nm

<infile sed -E 's/[[:blank:]]+/\n/g;/([^\n]+\n){1}Turtle/{s/([^\n]+\n){0}([^\n]*).*/\2/;p};d'
Run Code Online (Sandbox Code Playgroud)
  • <infile 源文件
  • sed -E ' 对于带有 ERE 正则表达式的 sed。
  • s/[[:blank:]]+/\n/g 将所有输入分成(运行)制表符或空格处的行。
  • /([^\n]+\n){1}Turtle/如果模式空间匹配第nth 字段(此处使用n-1( {1}))。
  • { 启动一系列命令。
  • s/开始替换(s///命令)。
  • ([^\n]+\n){0}匹配m-1( {0}) 行(用于字段m)。
  • ([^\n]*)捕获字段(行)以保留在反向引用中\2
  • .* 并匹配其他所有内容(在模式空间(原始行)中)。
  • /\2/将以上所有内容(模式空间)替换为\2.
  • ;p};打印出来。并关闭命令序列。
  • d 无论如何,删除模式空间,重新开始。
  • ' 结束 sed 命令。