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

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

我需要编写一个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

答案1

使用 awk:

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

使用 sed:

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

解释:

  • <infile源文件
  • sed -E将 sed 与 POSIX ERE(扩展正则表达式)结合使用
  • 's/[[:blank:]]+/\n/g+用新行替换所有(运行)制表符空间。
  • /([^\n]+\n){1}Turtle\n/如果字段n(此处使用n-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'
  • <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 命令。

答案2

您可以使用:

awk '$2 == "Turtle" {print $1}' file
259497
457032

答案3

使用 sed:

sed -n '/\sTurtle\s/s/^\([0-9]\+\)\s.*/\1/p' file

答案4

打高尔夫球:

$ awk '$2=="Turtle"&&$0=$1' <file
259497
457032

或者,分阶段扩展,直到我们得到艾萨克和戈罗的答案

awk '$2 == "Turtle" && $0 = $1' <file

awk '$2 == "Turtle" { $0 = $1; print }' <file

awk '$2 == "Turtle" { print $1 }' <file

三者不是确切地相当于我的高尔夫代码如果为零则不会打印数字( 的结果$0=$1用作条件)。


这是sed弥补上述高尔夫问题的正确解决方案:

$ sed -n '/\<Turtle\>/s/[[:blank:]].*//p' <file
259497
457032

它找到包含该单词的所有行Turtle,然后删除这些行上的第一个空格或制表符及其后面的所有内容,然后再打印它们(其他行的打印被 禁止-n)。

and匹配单词\<\>开始和结束边界,以便\<Turtle\>仅匹配字符串Turtle而不匹配eg RedTurtle

相关内容