我有一个这样的文件:
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
任何想法?
谢谢
答案 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