Menu
  • HOME
  • TAGS

Calculating ratio value within a line which contain binary numbers “0” & “1”

awk,gawk

It is not clear to me from the description what the format of the input file is. Assume the input looks like: $ cat file 0 0 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0...

Stable sorting two files into one with the duplicates

bash,sorting,unix,awk,gawk

Using the -s flag performs a stable sort. sort -s -t \| -k1,1 t1.txt t2.txt From man sort: -s, --stable stabilize sort by disabling last-resort comparison ...

Design the output with awk or gawk script

awk,gawk

Instead of print you can use printf. Change the END{} part of your awk script as follows: END {for (i in a) {printf "%d\t%d\n", i, a[i]};} Between the two values (%d) it prints a tab (\t) and at the end a newline (\n). Or your complete command: for file in...

counting unique numbers from each file

awk,gawk

With GNU awk you can use BEGINFILE and ENDFILE blocks. $ cat file1 1586-1081 1586 1081 B-A NZ-OD1 3.01273 1586-1081 1586 1081 B-A NZ-OD2 2.69347 1589-1100 1589 1100 B-A NH1-OE1 3.80491 1589-1085 1589 1085 B-A NH2-OE2 2.7109 $ cat file2 43-415 43 415 B-A OE1-NH1 2.84503 43-415 43 415 B-A...

print last line of a file and append a value using awk

bash,awk,append,gawk

Simply awk 'END { print $0, value }' averages.dat >> averages2.dat END is to be understood as the condition under which the block behind it is executed; thus this executes print $0, value if the end of the input has been reached. This is the case only when the last...

awk to ignore double quote and compare two files

awk,gawk

$ awk 'FNR==NR{a[$1]=1;next} a[$3]==0' file1 FS='["|]+' file2 "b"|"124"|"ind" "d"|"122"|"aus" How it works: file1 FS='["|]+' file2 This list of files tells awk to read file1 first, then change the field separator to any combination of double-quotes and vertical bars and then read file2. FNR==NR{a[$1]=1;next} FNR is the number of lines...

Redirect awk result to text file

windows,command-line,awk,command-line-arguments,gawk

Edited - It seems there is a problem with quotes being handled in the line between awk and cmd. To use a quote as delimiter change it to awk -F \x22 "{count+=$2}END{print count+0}" "input.txt" > "output.txt" ...

awk reparse piped input without getline

bash,awk,gawk

There's not really a better way to do it (EDIT: actually, it's probably better to use an array as Ed Morton has said; see his post and my alternate example at the end of this post), but it's not a very "awkish" program since it doesn't use the pattern{action} paradigm....

Join multiple files in gawk

awk,gawk

For given sample files: $ head f* ==> f1 <== a 123 b 221 c 904 ==> f2 <== a 298 b 230 c 102 ==> f3 <== a 500 b 600 c 700 Method 1: $ awk '{a[FNR]=((a[FNR])?a[FNR]FS$2:$0)}END{for(i=1;i<=FNR;i++) print a[i]}' f* a 123 298 500 b 221 230 600...

awk error: each rule must have a pattern or an action part

linux,gawk

The errors, as awk helpfully (though verbosely) tells you awk: cmd. line:1: /^e/ {i++; rx[i]=$2}; tx[i]=$10}; END{printf(" down: %.2f Mbps, up: %.2f Mbps", ((rx[2]-rx[1])/1024/1024)), ((tx[2]-tx[1])/1024/1024))} awk: cmd. line:1: ^ syntax error awk: cmd. line:1: each rule must have a pattern or an action part awk: cmd. line:1: /^e/ {i++; rx[i]=$2};...

Multiple awk programs in one go

awk,sed,gawk

Your posted expected output doesn't match your posted input, nor does it match your stated requirements so this is just a guess but maybe this is what you want: $ cat tst.awk BEGIN { FS=OFS="," } { gsub(/[^[:alnum:][:space:]_,]/,"") for (i=1;i<=NF;i++) { split($i,a,/ /) $i = "" for (j=1;j in a;j++)...

Repeating the format specifiers in awk

awk,printf,gawk

This may help you [[email protected] tmp]$ cat test.for implicit none integer i write(*,'(10I5)')(i,i=1,100) end [[email protected] tmp]$ gfortran test.for [[email protected] tmp]$ ./a.out 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29...

awk variables and printf

awk,printf,gawk

Script Try this awk script: BEGIN { FS = "," update = 34513135 } NR != 1 { vpip = $2 gsub(/"/, "", vpip) if (vpip > 37.5) label = 0 else if (vpip < 10) label = 1 else if (vpip < 16.5) label = 2 else label =...

Redirecting stdout to a file in awk

bash,awk,gawk

awk '{FS =","};{print $3}' test.log > test1.log The first action is {FS = ","} and it is being executed for each line. It should probably be preceded by BEGIN. Because the field separator is currently not set until after the first line is already read and split, the first line...

Unix utilities, sum the data under the save entries

unix,command-line,awk,gawk

You can try something like: $ awk '{ for(i=1; i<=NF; i+=2) names[$i] = ((names[$i]) ? names[$i]+$(i+1) : $(i+1)) } END{ for (name in names) print name, names[name] }' quest Tom 200 John 10 You basically iterate over the fields creating keys for all odd fields and assigning values of even...

Appending a column of multiple files to one output file

awk,linux-kernel,gawk

Given your new question: $ paste file1 file2 file3 | awk '{print $2,$4,$6}' 10.0 14.0 9.0 13.0 11.0 11.0 14.0 12.0 4.0 To avoid hard-coding the field numbers in the awk part so it'd work as-is with any output from paste: $ paste file1 file2 file3 | awk '{for (i=2;i<=NF;i+=2)...

awk unmatched with blank file

bash,awk,gawk

There isn't any data in file1, so the overall record number never changes, so FNR == NR throughout file2. I'm not sure there's an easy way to fix that, either. You can't even use a BEGIN block to record the current file name and spot when the file name changes....

calculating sum and average only for selected data set only

awk,gawk

awk -v tgt="O22" ' $7 ~ tgt && $8 ~ tgt { sum+=$4; cnt++ } END { print sum+0, (cnt ? sum/cnt : 0) } ' file ...

Trim first N bases in multi fasta file with awk and print with max width format

awk,gawk,fasta

To answer your specific questions, you can specify the width of an output field using the * format modifier: $ awk 'BEGIN{printf "%s\n", "foo"}' foo $ awk 'BEGIN{printf "%*s\n", 10, "foo"}' foo and no, there is no join function to put arrays back together into a string (the opposite of...

awk to get IP info

awk,gawk

Here is a working version based on Kents verson: ifconfig -a|awk -v RS="" '{for(i=1;i<=NF;i++){ if($i=="HWaddr") mac=$(i+1) else if($i~/addr:[0-9]/) {split($i,a,":");ip=a[2]} else if($i~/Mask/) {split($i,a,":");mask=a[2]}} if(ip!="127.0.0.1")print $1,mac,ip,bcast,mask}' eth0 00:18:71:6a:f0:45 192.168.1.30 255.255.255.0 I have skipped the Broad Cast address, since its always the last IP in the segment and normally not needed....

deleting header lines with no following content lines using awk

awk,sed,gawk

To make the existing code work, replace: if (flag == 1) {print $kept; print $0;} With: if (flag == 1) {print kept; print $0;} Other approaches $ awk '/^###/{kept=$0;f=1;next} f {print kept} {f=0;print}' gg ### ./transla file 1 _help_hu.ts ### < alala0 ------ > blabla0 ### ./transl file 2 t_help_hu.ts...

Adding input files from within a gawk action

awk,gawk

Assuming every line of file is a file name, this will execute do stuff on every file whose name is contained in file. awk 'NR==FNR{ ARGV[ARGC] = $0; ARGC++; next } { do stuff }' file If this isn't waht you want edit your question to describe your requirements better...

awk to compare two file by identifier & output in a specific format

awk,pattern-matching,gawk

I would say: awk 'BEGIN{FS=OFS="|"} FNR==NR {for (i=1;i<=NF;i+=2) a[FNR,i]=$i; next} {for (i=1; i<=NF; i+=2) if (a[FNR,i] && a[FNR,i]!=$i) $i=$i"#"a[FNR,i] }1' f1 f2 This stores the file1 in a matrix a[line number, column]. Then, it compares its values with its correspondence in file2. Note I am using the field separator |...

using indexed arrays as a format map of input data in gawk

arrays,awk,gawk

Change (length($i) > map[$i]) to (length($i) > map[i]) and substr($i, 1, map[$i]) to substr($i, 1, map[i]) . Like this: gawk -F"|" -- ' BEGIN { map[1]=10 map[2]=20 map[3]=60 map[4]=60 map[5]=3 map[6]=60 map[7]=3 OFS="|" } { for(i = 1; i <= NF; i++) { if (length($i) > map[i]) { $i =...

Reading Trace file from NS2 using gawk

awk,gawk,ns2

Assuming you are using bash Syntax of while loop: while test-commands; do consequent-commands; done more info For comparison using < operator you need to use Double-Parentheses see Shell Arithmetic and Conditional Constructs. To assign value to the variable you used in the code just write i=0. To access a shell...

awk - show difference between two fields

awk,gawk

To print the differences as jaypal points out: awk '{gsub($1,"",$2)}1' file bar foo 111 random ...

Awk, little endian order and 4 hex digits

awk,hex,gawk,little-endian,dec

echo 00017BE6 | awk '{for (i=7;i>=1;i=i-2) printf "%s%s",substr($1,i,2),(i>1?",":"\n")}' E6,7B,01,00 Using sprintf, we can start with the decimal number: $ echo 97254 | awk '{hex=sprintf("%08X",$1); for (i=7;i>=1;i=i-2) printf "%s%s",substr(hex,i,2),(i>1?",":"\n");}' E6,7B,01,00 How it works for (i=7;i>=1;i=i-2) This starts a loop over index i in which we count down from 7 to 1....

ioStat and Awk Output and Format with Megabyte and end of each field

awk,format,gawk,iostat,megabyte

I actually found out how: iostat -m 3 2 | grep dm-0 |awk '{a+=$2;b+=$3;c+=$4}END {print a"\n"b"Mb\n"c"Mb\n"}' Worked perfectly :-)....

How to match and change strings in a column of a semicolon separated file?

regex,awk,sed,gawk

There's no need for a separate condition with gsub - you can just apply it to each record and it won't do anything for those that don't match: awk -F\; -v OFS=";" '{gsub(/value/,"column 8",$8)}1' infile.csv > outfile.csv It is very important that you escape/quote the ; so that it isn't...

awk if statement with simple math

unix,awk,gawk

There's no need to force awk to recompile every record (by assigning to $4), just print the current record followed by the result of your calculation: awk 'BEGIN{FS=OFS=","; OFMT="%.2f"} {print $0, $3*($3>1336?0.03:0.05)}' file ...

How to select range for two operations?

awk,gawk

I think you have to limit which lines to do calculations, using the NR variable. And for results, I'm not into maths, but you should not choose the whole length of the file (NR), but the length of the lines used for calculations (length(array)), so it would result like: awk...

use awk to group and calculate data

csv,awk,gawk,bsd

$ cat tst.awk BEGIN { FPAT="([^,]*)|(\"[^\"]+\")"; OFS="," } { cnt[$1][$6]++ sum[$1][$6]+=$NF name[$1][$6]=$2 } END { for (numeric in cnt) { for (type in cnt[numeric]) { print numeric, name[numeric][type], type, cnt[numeric][type] (type ~ /^(C C R|A)$/? "" : OFS sum[numeric][type]) } } } $ awk -f tst.awk file 2600,AEIOU-2600,C C R,3...

How do I run a gawk file with spaces in the path name?

file,command-line,awk,space,gawk

I think it will be a case of providing quotes in the command string: command = "gawk" command = command " -v version=\"" dataArray[1] "\"" command = command " -v date=\"" dataArray[2] "\"" command = command " -v platform=\"" dataArray[3] "\"" command = command " -f \"" INSTALLATION_LOCATION_GAWK "generateSanity_Scripts/removeData.awk\"" command...

Using awk on multiple input files

bash,awk,gawk

I wouldn't use Awk for this. while IFS=, read -u 3 filename lines; do head -n "$lines" >"$filename" done 3<other.csv <main.csv The read -u to read from a particular file descriptor is not completely portable, I believe, but your question is tagged bash so I am assuming that is not...

Quoting a complex awk program in tmux.conf

awk,escaping,tmux,gawk,quoting

Setting status-right Quoting with shell command #( ) in tmux Quoting is complex in tmux #( ) because the contents are evaluated twice. For this reason let's simplify the gawk program to: sensors | awk '/^Physical id 0:/ { sub(/^+/, "", $4); print $4; exit }' Now we plug it...

awk calculations based on field value

csv,awk,gawk,bsd

Is this what you're looking for? $ cat tst.awk BEGIN { FPAT="([^,]*)|(\"[^\"]+\")"; OFS="," } { print $0, $4 * .02 * ($3 ~ /C C [RA]/ ? 1 : .013) } $ awk -f tst.awk file 30409,DPUMA - 147803,D C S,2,0.00052 30392,"SNI TIC , L.P. - 93001",C C S,175,0.0455 30425,QJEU...

how swap lines with awk with only a single pass and limited memory use?

awk,swap,gawk

@JoseRicardoBustosM. it is impossible to do it in one pass in awk without saving the lines from the init to one before the end line in memory. Just think about the impossibility of getting a line N lines ahead of what you've already read to miraculously show up in place...

How to set the field separator to an empty string?

awk,gawk

Looks like you can do this: $ awk -F '' '{print $2}' <<< "abc" b Tested on GNU awk (versions 3.0.4 and 4.1.1) and mawk version 1.2 To be clear, the space between -F and '' is important!...

normalize column data with maximum value of that column

awk,gawk

Let's take this as the sample input file: $ cat >file 1 5 2 2 3 7 4 6 This awk script will normalize the second column: $ awk 'FNR==NR{max=($2+0>max)?$2:max;next} {print $1,$2/max}' file file 1 0.714286 2 0.285714 3 1 4 0.857143 This script reads through the input file twice....

using awk for subtraction

awk,gawk

I think what you need is {print $0, 20 - ($4 < 20 ? $4 : 20)} Or to make it even more straightforward {print $0, ($4 < 20 ? 20 - $4 : 0)} If $4 is less than 20, this returns 20 - $4 as the fifth field....

AWK: go through the file twice, doing different tasks

awk,gawk

The idiomatic way to process two separate files, or the same file twice in awk is like this: awk 'NR==FNR{ # fill associative array next } { # use the array }' file1 file2 The total record number NR is only equal to the record number for the current file...

awk read float precision: cannot read small floats, e.g. 4e-320

bash,awk,floating-point,floating-point-precision,gawk

I get the expected output from awk version 3.1.5. I get your output from awk version 3.1.7. You can force awk to convert a string to a number by adding zero to it. So try this awk script instead: printf '4\n3e-20\n4.5e-320\n3\n1e-10\n' | awk '$1+0 > 1e-15' ...

awk to process the first two lines then the next two and so on

bash,unix,awk,gawk

$ cat tst.awk BEGIN { FS="[|][|]"; OFS="||" } NR%2 { split($0,old); next } { for (i=1;i<=NF;i++) { if (old[i] != $i) { $i = $i "#" old[i] } } print } $ $ awk -f tst.awk file 102310863||7097881||6845123#6845193||271640||06007709532577|||| 102310875||7092992||6840818#6840808||023740||10034500635650|||| ...

gawk printf missing characters

awk,printf,gawk

Answer is Community Wiki to give what credit can be given where credit is due. Primary problem and solution As swstephe noted in a comment: You need to escape your quotes: printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") Anti-patterns I regard your outline script as an anti-pattern (actually, two anti-patterns). You have: BEGIN {printf("<?xml...

if value of column 3 is greater than cap print it in tmp not working properly

bash,awk,sh,gawk

Here is how to read bash variable using awk awk -v var="$cap" '$3>var' "$f" > $tmp or awk '$3>var' var="$cap" "$f" > $tmp Your variable does not expand within singe quote 'code' You do not need print $0, its the default action of there is no action. Always double quote...

Using Gawk and Printf in a Bash script

bash,scripting,printf,file-handling,gawk

Ignoring the issue of the outer loop and focusing on the awk part of the question, you can use sprintf to produce your filename: gawk -v RS="START_of_LINE_to_SEPARATE" 'NF{ file = sprintf("new_file_%04d.txt", ++n) print RS$0 > file }' "$i" The format specifier %04d means that the number is a digit, padded...

comparison of two file & mark changed fields.

awk,gawk

Cannot comment but bongboys answer will produce a||d||f||a 1||1#2||3#||4 1#||2#||r#||f# Which is not the expected output This command awk 'BEGIN{FS=OFS="|"} NR==FNR{for(i=1;i<=NF;i++)a[FNR" "i]=$i;b[FNR]=$0;next} {for(i=1;i<=NF;i++)(FNR" "i in a)&&a[FNR" "i]!=$i&&$i=$i"#"a[FNR" "i]} !(b[FNR]==$0)' file{1,2} produces 1||1#2||3#||4 1||2||r||f Which is the expected output....

Add filename to appended text file in shell script above pasted text

osx,bash,shell,terminal,gawk

You do not show the filter.dat script, but gawk does know the name of the current input-file, which can be incorporated into the logic of your script (see manual): FILENAME The name of the current input file. If no files are specified on the command line, the value of FILENAME...

How to remove empty lines to one empty line between sentences in text files?

sed,grep,gawk

You can use awk for this: awk 'BEGIN{prev="x"} /^$/ {if (prev==""){next}} {prev=$0;print}' inputFile or the compressed one liner: awk 'BEGIN{p="x"}/^$/{if(p==""){next}}{p=$0;print}' inFl This is a simple state machine that collapses multi-blank-lines into a single one. The basic idea is this. First, set the previous line to be non-empty. Then, for every...

awk program from solaris machine gives warnings in linux nawk

linux,bash,awk,solaris,gawk

Here's a simple example that triggers the warning (GNU awk; on some Linux systems, nawk is a symlink to GNU awk, gawk): awk 'BEGIN { print "\<exam" }' # -> '<exam' If your output is OK, and all you need to do is to get rid of the warning, simply...

distribution of values in intervals with awk

awk,gawk

I'm confused by your question but if I understand what you want then this is the right approach: $ cat tst.awk { bucket = int(($2/10)+1) count[bucket]++ max = ((NR==1 || bucket>max) ? bucket : max) } END { for (bucket=1;bucket<=max;bucket++) { printf "%d%s", count[bucket], (bucket<max?OFS:ORS) } } $ awk -f...

how to use regular expression in awk or sed, for find all homopolymers in DNA sequence?

regex,awk,sed,bioinformatics,gawk

grep -o will get you that in one-line: echo "ACCCGGGTTTAACCGGACCCAA"| grep -ioE '([A-Z])\1*' A CCC GGG TTT AA CC GG A CCC AA Explanation: ([A-Z]) # matches and captures a letter in matched group #1 \1* # matches 0 or more of captured group #1 using back-reference \1 sed is...

Add consecutive entries in a column

c++,awk,sed,grep,gawk

awk 'NR%4==1{sum=$2; next}{sum+=$2} NR%4==0{print ++j,sum;}' input.txt Output: 1 17995 2 624 3 1229 For first number of a group it stores value of second column in $2, for next 3 rows adds the value of the second column and sum. for last row of a group NR%4==0 prints the result....

Join two tables with AWK, one from stdin, other from file

awk,gawk,tab-delimited

Assuming your solution works as desired, it is trivial. Instead of: awk -F '\t' 'FNR==NR{ a[$1] = $2; next }{ print $1 FS a[$1] }' tmp1.tsv tmp2.tsv simply do: < tmp2.tsv awk -F '\t' 'FNR==NR{ a[$1] = $2; next }{ print $1 FS a[$1] }' tmp1.tsv - (Note that I've...

Confusing backslash before awk, what does it mean?

bash,hadoop,awk,gawk

Either the book contains a typo, or the script was incompletely transcribed. A backslash may optionally be used for line wrapping: echo "moo" | \ wc -l which is equivalent to echo "moo" | wc -l but in this particular case, the backslash is completely optional after a pipe, so...

Get string inside quotation marks in command line/awk

windows,command-line,awk,command-line-arguments,gawk

See if this works: awk -F'\"' '{print $2}' ...

Printing the compared result under last column header

awk,ksh,gawk

To avoid having header updated, change awk's expression to the following: 'FNR==NR{a[$1]=$7;next} FNR==1{print $0; next} {print (($1 in a) ? $0","a[$1] : $0",NA");}' In this case 1st line of the file1.txt will be printed as is, without any changes. But don't you also need to have new day (like "D10"...

initialising field seperators on condition in awk

awk,gawk

You can use split. Eks get the middle date from third field green echo "on,cat ,blue|green|red,more" | awk -F, '{split($3,a,"|");print a[2]}' green And you BEGIN block is not only where you can set the Field Separator: echo "on,two,three" | awk -F, '{print $2}' echo "on,two,three" | awk '{print $2}' FS=,...

awk count number of occurrences of each character in entire file

awk,gawk

$ awk '{for (i=1; i<=NF; i++){a[$i]++}}END{for (i in a){print i, a[i]}}' FS= file A 5 B 13 C 20 D 36 E 14 9 2 F 10 : 3 G 14 . 1 H 21 < 1 I 29 J 7 = 4 # 2 > 3 1 2 ?...

awk: how to append lines in a file until finding a file separator symbol?

windows,awk,gawk

You can say: $ awk -v RS="|" '{$1=RS$1} NF>1' a |<text_0> <text_1> <text_2> until <text_16> |<text_0> <text_1> <text_2> until <text_12> |<text_0> <text_1> <text_2> until <text_31> This sets the record separator to the pipe | and then refactors all the line with the $1=$1 expression. But as you want a pipe...

How to make this awk command more simple

linux,awk,cut,gawk

First one is like this: awk '/cpu MHz/ {print $4}' < /proc/cpuinfo | awk -F'.' 'NR==1 {print $1}' Considering you have a string like this: cpu MHz : 800.000 cpu MHz : 800.000 cpu MHz : 800.000 cpu MHz : 800.000 And you want the integer part of the number...

If statement in GAWK gives an error

awk,gawk

gawk '{if (match($5,/hola/,a) && $6=="hola") {print $2"\t"$1"\t"$2"\t"$1"\t"$3} else if `(match($5,/(_[joxT]+\.[0-9]*)/,a) && match($6,/(_[joxG]+\.[0-9]*)/,b)) {print $2""a[1]"\t"$1""b[1]} else if (match($5,/(_[joxT]+\.[0-9]*)/,a) && $6=="hola") {print "hola"}}' pasted` ...

Group by based on 4 fields and sum up

awk,group-by,sum,gawk

Ok output obtained: date dAccused TrafficCase ServiceCode Duration Cost BalanceAfter MainAmount BalanceBefore 2014-07-02 1 0 4 0 10 16070 10 16080 2014-07-03 9 0 4 0 1 0.5 0 0.5 2014-07-04 NULL 0 4 0 0 0 0 0 2014-07-02 2 0 3 0 10 1020.6 10 1030.6 I've modifed...

awk to match two files and output the difference with column name & value

awk,gawk

Awk, will work for more rows as well awk -F, 'NR==FNR{for(i=1;i<=NF;i++)a[NR,i]=$i;next} {for(i=1;i<=NF;i++)if(a[FNR,i]!=$i)print "Row:"FNR,"Col:"i"->",a[FNR,i]","$i}' file{1,2} Example Input File1 1,2,3,4,5,6 6,5,4,3,2,1 File2 1,2,5,4,5,7 6,4,4,3,1,1 Output Row:1 Col:3-> 3,5 Row:1 Col:6-> 6,7 Row:2 Col:2-> 5,4 Row:2 Col:5-> 2,1 ...

AWK - Search for a pattern-add it as a variable-search for next line that isn't a variable & print it + variable

regex,linux,awk,sed,gawk

I'd say awk '/\.pp/ { if(NR != 1) print line; line = $0; next } NF != 0 && substr($1, 1, 1) != "#" { line = line $0 } END { print line }' filename This works as follows: /\.pp/ { # if a line contains ".pp" if(NR !=...

awk: how to include file names when concatenating files?

regex,awk,gawk

Put this in foo.awk: BEGIN{ RS="^$"; ORS=""; OFS="|" } { gsub(/\n[\r]?/," "); print FILENAME, $0 > "new_file.txt" } and then execute it as awk -f foo.awk <files> where <files> is however you provide a list of file names in Windows. It uses GNU awk for multi-char RS to let you...

How to use “awk” command to retrieve particular field, but the field number is given in runtime?

bash,awk,gawk

Shell environment variable are not awk environment variables: You can use the -v flag to turn one into the other: pax> a=1;b=2;awk -vb=$b 'END{print a;print b}' </dev/null 2 In your particular case, this snippet may show it better: pax> lField=2;echo "A B C" | awk '{print $lField}' A B C...