在列值条件下使用awk


108

我正在从AWK编程语言学习awk,其中一个示例存在问题。

如果我想在$ 2等于值的情况下打印$ 3(例如1),则我使用的是此命令,它可以正常工作:

awk '$2==1 {print $3}' <infile> | more

但是,当我用另一个搜索条件(例如findtext)代替1时,该命令不起作用:

awk '$1== findtext {print $3}' <infile> | more

它不返回任何输出,并且我确定输入文件中存在“ findtext”。

我也试过了,但是不起作用:

awk '$1== "findtext" {print $3}' <infile> | more

这是我的测试文件“ test”,它有9行和8个字段,以空格分隔:

1 11 0.959660297 0 0.021231423 -0.0073 -0.0031 MhZisp
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
3 19 0.98089172 0 0 -0.0158 0.0124 MhNonZ
4 15 0.704883227 0.265392781 0.010615711 -0.0087 -0.0092 MhZisp
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
6 23 0.715498938 0 0.265392781 -0.0013 -0.0309 Unkn
7 26 0.927813163 0 0.053078556 -0.0051 -0.0636 MhZisp
8 44 0.55626327 0.222929936 0.201698514 0.0053 -0.0438 MhZisp
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ

这是我的工作以及输出:

$awk '$8 == "ClNonZ" {print $3}' test 

$ grep ClNonZ test 
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ

我希望看到这是在其$ 8中包含“ ClNonZ”的$ 3。

0.180467091 
0.010615711 
0.492569002

不知道为什么awk命令没有返回任何内容。有什么想法吗?


您需要引用字符串值“ findtext”,否则它是一个变量名
evil otto

我用“ findtext”尝试了双引号,但是它不起作用..这就是为什么它困扰我
user1687130 2013年

1
“不工作”没有告诉我们任何事情。向我们显示确切的输入,确切的代码,预期的输出和实际的输出。
chepner

Answers:


128

如果您要查找特定的字符串,请在其周围加上引号:

awk '$1 == "findtext" {print $3}'

否则,awk将假定它是一个变量名。


我试过了,但是不起作用,我不知道为什么。我用grep仔细检查了一下,文本在那里。:(
user1687130

1
@ user1687130,我认为您需要向我们展示一些示例输入和预期输出。
卡尔·诺鲁姆

1
您确定数据以空格分隔。可能其中一些空格是制表符吗?尝试使用awk回显单个字段。不awk '{ print $8 }'给你你所期望?
罗布·戴维斯

1
这可能是由于AWK实现(与检查awk --version),看看我的答案,它工作在GAWKMAWK太。
arutaku

当我们在awk脚本周围使用双引号时,这将不起作用。赞awk "$1 == \"findtext\" {print $3}"
Thirupathi Thangavel

33

此方法使用regexp,它应该可以工作:

awk '$2 ~ /findtext/ {print $3}' <infile>

谢谢,我正在寻找一种方法来使用awk在$ NF上查找正则表达式,而无需使用合成代谢方法和grep ^^
Thibault Loison

20

取决于AWK实现方式,您是否可以使用==

你尝试过~吗?例如,如果您希望$ 1是“ hello”:

awk '$1 ~ /^hello$/{ print $3; }' <infile>

^ 表示$ 1开始,并且 $以$ 1结尾。


4
所有的awk实现都支持“ ==”和“〜”。
Ed Morton 2013年

2
@EdMorton-OS X awk无法匹配==,但是成功~
jww

2
@jww无法与什么匹配?这些是等效的:$1 == "hello"$1 ~ /^hello$/。您永远都不要这样做$1 ~ "^hello$",因为它在正则表达式上下文中使用了字符串,因此awk必须在使用前将字符串转换为正则表达式,并且具有副作用(man awk)。
Ed Morton

4

这对我来说更具可读性

awk '{if ($2 ~ /findtext/) print $3}' <infile>

2

我的awk版本是3.1.5。

是的,输入文件以空格分隔,没有制表符。

根据arutaku的回答,这是我尝试的有效方法:

awk '$8 ~ "ClNonZ"{ print $3; }' test  
0.180467091
0.010615711
0.492569002


$ awk '$8 ~ "ClNonZ" { print $3}' test  
0.180467091
0.010615711
0.492569002

什么没用(我不知道为什么,也许是由于我的awk版本:),

$awk '$8 ~ "^ClNonZ$"{ print $3; }' test
$awk '$8 == "ClNonZ" { print $3 }' test

谢谢大家的回答,评论和帮助!


9
这与您的awk版本无关。您是在Windows上创建测试文件的,因此无论您使用哪种工具,都将control-M附加到每行的末尾,所以每行的最后一个字段是ClNonZ<control-M>ClNonZ这不是为什么使用grep或“〜在awk中找到了,但是没有进行相等比较。
Ed Morton

2
是的,有道理。我尝试了$ dos2unix测试,然后使用“ ==”替换了“〜”,它可以正常工作。感谢您的解释!
user1687130

-3

请尝试这个

echo $VAR | grep ClNonZ | awk '{print $3}';

要么

echo cat filename | grep ClNonZ | awk '{print $3}';

可悲的是,这个答案实际上并没有使用用户特别要求的Awk语法!
阿斯凡德·卡兹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.