Passing variables into awk from bash

北慕城南 提交于 2019-12-08 19:26:53

问题


I am writing a shell script file in which I have to print certain columns of a file. So I try to use awk. The column numbers are calculated in the script. Nprop is a variable in a for loop, that changes from 1 to 8.

avg=1+3*$nprop
awk -v a=$avg '{print $a " " $a+1 " " $a+2}' $filename5 >> neig5.dat

I have tried the following also:

awk -v a=$avg '{print $a " " $(a+1) " " $(a+2) }' $filename5 >> neig5.dat

This results in printing the first three columns all the time.


回答1:


avg=1+3*$nprop

This will set $avg to 1+3*4, literally, if $prop is 4 for instance. You should be evaluating that expression:

avg=$(( 1+3*$nprop ))

And use the version of the awk script with parenthesis.




回答2:


This single awk script is a translation of what you want:

awk '{j=0;for(i=4;i<=25;i=3*++j+1)printf "%s %s %s ",$i,$(i+1),$(i+2);print ""}' 

You don't need to parse your file 8 times in a shell loop just parse it once with awk.




回答3:


Use a BEGIN{ } block to create a couple of awk variables:

avg=$((1+3*$nprop))

awk -v a=$avg 'BEGIN{ap1=a+1;ap2=a+2} {print $a " " $ap1 " " $ap2}' $filename5 >> neig5.dat



回答4:


awk -v n="$nprop" 'BEGIN{x=3*n} {a=x; print $++a, $++a, $++a}' file

If you just want your seed value (nprop) to increment on every pass of the file and process the file 8 times, get rid of your external loop and just do this:

awk 'BEGIN{for (i=2;i<=8;i++) ARGV[++ARGC] = ARGV[1]} {a=3*NR/FNR; print $++a, $++a, $++a}' file

In GNU awk you can replace NR/FNR with ARGIND.



来源:https://stackoverflow.com/questions/16340775/passing-variables-into-awk-from-bash

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!