如何使用awk提取具有确定范围的列

时间:2017-07-05 15:19:33

标签: bash awk

我有一个这样的文件:

  

57580.87499999965802999 -2.01319509921268036e + 00>

     

57580.91666666632227134 -2.00037110698185661e + 00>

     

57580.95833333298651269 -1.98754711475190549e + 00>

     

57580.99999999965075403 -1.97472312252219151e + 00>

     

57581.04166666631499538 -1.95440667936783941e + 00>

     

57581.08333333297923673 -1.94158268713747040e + 00>

     

57581.12499999964347808 -1.92875869490721019e + 00>

     

57581.16666666630771942 -1.91593470267662269e + 00>

     

57581.20833333297196077 -1.89561825952250729e + 00>

我想使用awk只打印以57581开头的列

我写的代码是

DATA=57581
DATA2=57582

awk '{ if ($1 >= $DATA'.00000000000000000' && $1 < $DATA2'.00000000000000000') print $1, $2 >> "file.txt"}' $filename

任何想法?

谢谢

2 个答案:

答案 0 :(得分:1)

这适合你:

awk '/^57581/' file

-bash-4.2$ awk '/^57581/' file
57581.04166666631499538 -1.95440667936783941e+00>
57581.08333333297923673 -1.94158268713747040e+00>
57581.12499999964347808 -1.92875869490721019e+00>
57581.16666666630771942 -1.91593470267662269e+00>
57581.20833333297196077 -1.89561825952250729e+00>
-bash-4.2$ 
  

awk模式/ ^ 57581 /将在行的开头搜索,并且   在哪里找你。

像往常一样,awk将完成剩下的工作,因为如果模式为真,它将打印整行。

修改 正如@EdMorton所建议的那样,OP说只打印以57581开头的列,那么代码应为:

 -bash-4.2$ awk '{for (a=1; a<NF; a++) { if (match($a, '/^57581/')==1){print $a}}}' file
57581.04166666631499538
57581.08333333297923673
57581.12499999964347808
57581.16666666630771942
57581.20833333297196077
-bash-4.2$

编辑2

正如所建议的那样,我添加了一个从Shell加载var的代码:

-bash-4.2$ export VAR=57581
-bash-4.2$  awk -v"myvar=$VAR" '{ for (a=1; a<NF; a++) { 
regex="^"myvar""; if ($a ~  regex){print $a}}}' file
57581.04166666631499538
57581.08333333297923673
57581.12499999964347808
57581.16666666630771942
57581.20833333297196077
-bash-4.2$ 

答案 1 :(得分:0)

我认为您正在寻找的是

awk 'int($1)==57581' file
如果没有在正确的地方检查小数点,

正则表达式检查会给你误报(例如,575810000将满足&#34;以&#34开始;条件)。

在你的表示法中,这相当于

awk -v lowerInc=57581 -v upperExc=57582 'lowerInc<=$1 && $1<upperExc' file