首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Awk:当列和在范围内时提取行

Awk:当列和在范围内时提取行
EN

Stack Overflow用户
提问于 2020-11-16 15:20:44
回答 3查看 66关注 0票数 1

使用Awk从$3-2在200到400之间的文件中提取行。

我正在使用的命令:

代码语言:javascript
运行
复制
awk '{ if ($3 - $2 > 199 && < 401) print $0}' Input_File

错误消息:

代码语言:javascript
运行
复制
  awk: syntax error at source line 1
 context is
    { if ($3 - $2 > 199 && >>>  < <<<  401) print $0}
awk: illegal statement at source line 1

如果我只使用一个参数(例如awk '{ if ($3 - $2 > 199) print $0}' Input_File ),但当我使用&&时,该命令就不能工作。我该怎么解决这个问题?

示例Input_File:

代码语言:javascript
运行
复制
A    1000    1500
B    1000    1300
C    1000    1100
D    1000    1200

期望输出的示例:

代码语言:javascript
运行
复制
B    1000    1300
D    1000    1200
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-16 15:25:12

你在&&之后的情况是不完全的。你可以用:

代码语言:javascript
运行
复制
awk '$3-$2 > 199 && $3-$2 < 401' file

B    1000    1300
D    1000    1200
票数 4
EN

Stack Overflow用户

发布于 2020-11-16 15:22:52

您可以创建一个与第3列和第2列不同的变量,然后在条件下使用它。

代码语言:javascript
运行
复制
awk '{ val=($3 - $2);if ( val > 199 && val < 401) print $0}' Input_File

为什么OP的尝试是错误的:OP使用的是if ($3 - $2 > 199 && < 401),这是错误的,因为第3列和第2列没有提到2次(在&&之后,在< 401之前),对于每个条件(或者用OR/和条件分隔),应该分别提到。所以应该是:if (($3 - $2 > 199) && ($3 - $2 < 401))。IMHO使变量更好地避免得到2次差异,将差异一次放入变量中,并在不同的条件下使用。

票数 2
EN

Stack Overflow用户

发布于 2020-11-16 17:44:57

如果你不想重复计算,你可以这样做

代码语言:javascript
运行
复制
$ awk '(d=$3-$2)>199 && d<401' file
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64860691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档