我需要编写一个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)
使用 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/如果字段n(n-1在此处使用)匹配Turtle(完全匹配)。([^\n]*).*/\1/ 提取字段 1(第一行)p};d' 打印选择的内容并在任何情况下删除所有内容。 任何一对字段的通用解决方案n和m:
<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 命令。