Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how awk takes the result of a unix command as a parameter?

Tags:

bash

shell

awk

Say there is an input file with tabs delimited field, the first field is integer

1 abc
1 def
1 ghi
1 lalala
1 heyhey
2 ahb
2 bbh
3 chch
3 chchch
3 oiohho
3 nonon
3 halal
3 whatever

First, i need to compute the counts of the unique values in the first field, that will be:

5 for 1, 2 for 2, and 6 for 3

Then I need to find the max of these counts, in this case, it's 6.

Now i need to pass "6" to another awk script as a parmeter.

I know i can use command below to get a list of count:

cut -f1 input.txt | sort | uniq -c | awk -F ' ' '{print $1}' | sort 

but how do i get the first count number and pass it to the next awk command as a parameter not as an input file?

like image 997
trillions Avatar asked Nov 29 '25 02:11

trillions


2 Answers

This is nothing very specific for awk.

Either a program can read from stdin, then you can pass the input with a pipe:

prg1 | prg2 

or your program expects input as parameter, then you use

prg2 $(prg1) 

Note that in both cases prg1 is processed before prg2.

Some programs allow both possibilities, while a huge amount of data is rarely passed as argument.

like image 55
user unknown Avatar answered Nov 30 '25 18:11

user unknown


This AWK script replaces your whole pipeline:

awk -v parameter="$(awk '{a[$1]++} END {for (i in a) {if (a[i] > max) {max = a[i]}}; print max}' inputfile)" '{print parameter}' otherfile

where '{print parameter}' is a standin for your other AWK script and "otherfile" is the input for that script.

Note: It is extremely likely that the two AWK scripts could be combined into one which would be less of a hack than doing it in a way such as that outlined in your question (awk feeding awk).

like image 34
Dennis Williamson Avatar answered Nov 30 '25 18:11

Dennis Williamson