使用Awk打印具有特定范围的内容

时间:2017-10-15 04:10:24

标签: bash unix awk

我有一个包含以下内容的文本文件:

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行的模式段。我如何正确指定范围?

1 个答案:

答案 0 :(得分:0)

您的代码:

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

这有一些错误:

  • 您需要将条件与&&结合使用,而不是逗号
  • $3的测试在更正后不会通过,因为您要求的值介于-71到74之间,但所有给定的值都低于-71
  • awk代码和文件之间需要一个空格。

此代码适用于您:

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

你可能会注意到这里没有动作。默认操作是按原样打印行,因此这与您给出的操作大致相当(尽管{print $1,$2,$3}使用OFS重新连接这些字段,默认为空格而不是制表符;您可以OFS="\t"; print $1,$2,$3保留该print $0或仅保留pyplot,这是默认情况下没有操作的情况。)

括号在技术上是不必要的。提供易读性。