我需要编写一个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'
打印所选内容并在任何情况下删除所有内容。
任意一对字段 和 的通用解决方案n
:m
<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/
如果模式空间与第n
th 字段匹配(此处使用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
。