【问题标题】:Printing contents with a specific range with Awk使用 awk 打印具有特定范围的内容
【发布时间】:2017-10-15 04:10:23
【问题描述】:

我有一个文本文件,其中包含:

Location 1  40.733596   -74.003139  
Location 2  43.758102   -73.975734  
Location 3  41.732456   -74.003755              
Location 4  42.345907   -71.087001

其中第一列只是位置计数,第二列代表纬度,第三列代表经度。

我正在尝试编写一个 awk 命令以仅打印出特定纬度和经度范围内的位置。

awk -F '\t' '$2>40,$2<=42,$3>=-71,$3<=74 {print $1,$2,$3}'LatLon.txt

在 awk 命令的模式段中,我试图指定第 2 列和第 3 列的范围,它会提示 bash 仅打印 40-42 lat 和 -71 到 -74 lon 范围内的位置。

我收到一个错误提示:

awk: bailing out at source line 1

由于我的 awk 行的模式段。如何正确指定范围?

【问题讨论】:

  • ,s 更改为&amp;&amp;(未经测试)。如果需要,您也可以使用||。祝你好运。
  • 四行都不符合你命令中的四个要求。
  • 我发现范围像这样(40 &lt; $2 &amp;&amp; $2 &lt; 42) &amp;&amp; (-74 &lt; $3 &amp;&amp; $3 &lt; -71) 更具可读性——更容易阅读最小值和最大值是什么
  • 并且由于您要打印整行,因此您根本不需要操作块{print $1, $2, $3} - 在真实条件下打印当前记录是 awks 的默认行为。

标签: bash unix awk


【解决方案1】:

您的代码:

awk -F '\t' '$2>40,$2<=42,$3>=-71,$3<=74 {print $1,$2,$3}'LatLon.txt

这里有一些错误:

  • 您需要将条件句与&amp;&amp; 结合起来,而不是逗号
  • 更正后,您对 $3 的测试将无法通过
    因为您要求的值介于 -71 和 74 之间,但所有给定值均低于 -71
  • 您需要在 awk 代码和文件之间留一个空格。

这段代码应该适合你:

awk -F '\t' '(40 < $2 && $2 <= 42) && (-74 <= $3 && $3 <= -71)' LatLon.txt

您可能会注意到此处缺少操作。默认操作是按原样打印该行,因此这与您给出的操作大致相当(尽管{print $1,$2,$3} 使用OFS 重新连接这些字段,默认为空格而不是制表符;你可以做@ 987654327@ 保留它或只是 print $0 这是默认情况下发生的情况,无需任何操作。)

括号在技术上是不必要的。提供它们是为了便于阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多