I have file :
result.txt
Apple fruits 10 20 30
Car vehicle 40 50 60
Book study 70 80 90
Assume here 2nd column is a feature, 3rd column is Min, 4th column is Median, 5th column is Max. I have another file config.txt which contains a property for each feature i.e.
config.txt
fruits Max
vehicle Median
study Min
So I want to write a script which shows only that column number for the feature which is defined in config.txt file.
Expected output:
Apple fruits 30
Car vehicle 50
Book study 70
I am following this link https://stackoverflow.com/a/40206489/10220825. Here what I have tried:
awk 'FNR==NR{arr[$2];next} $1 in arr {var =$2;print var}' result.txt config.txt
I am able to hold the property (like Min, Max, Median) in a variable for the corresponding feature defined in result.txt, but not able to display the column for that variable. Please suggest me an approach on how to print the column for the corresponding column.
$ awk 'BEGIN {m["Min"]=3; m["Median"]=4; m["Max"]=5}
NR==FNR {a[$1]=$2; next}
{print $1,$2,$m[a[$2]]}' config result
Apple fruits 30
Car vehicle 50
Book study 70
you need to keep a map of min/median/max to the corresponding column index and lookup through the config file which value needs to be printed.
add a[$2] to the print if you want to print Max/Min/Median information.
NR==FNR {a[$1]=$2; next} is the awk idiom to load file1 into an array indexed with first field and field two as values, essentially a dictionary or a lookup table.
You can try Perl as well
perl -lane ' BEGIN { @kv{qw(Min Median Max)}=(2,3,4);
%kw=map{chomp;split} qx(cat ratnesh_config.txt) }
$p=$kv{$kw{$F[1]}}; print "$F[0] $F[1] $F[$p]" ' ratnesh_in.txt
with the given inputs:
$ cat ratnesh_config.txt
fruits Max
vehicle Median
study Min
$ cat ratnesh_in.txt
Apple fruits 10 20 30
Car vehicle 40 50 60
Book study 70 80 90
$ perl -lane 'BEGIN { @kv{qw(Min Median Max)}=(2,3,4);%kw=map{chomp;split} qx(cat ratnesh_config.txt) } $p=$kv{$kw{$F[1]}}; print "$F[0] $F[1] $F[$p]" ' ratnesh_in.txt
Apple fruits 30
Car vehicle 50
Book study 70
$ perl -lane 'BEGIN { $kv{Min}=2;$kv{Median}=3;$kv{Max}=4;%kw=map{chomp;split} qx(cat ratnesh_config.txt) } $p=$kv{$kw{$F[1]}}; print "$F[0] $F[1] $F[$p]" ' ratnesh_in
.txt
Apple fruits 30
Car vehicle 50
Book study 70
$ perl -lane 'BEGIN { @kv{qw(Min Median Max)}=(2,3,4);%kw=map{chomp;split} qx(cat ratnesh_config.txt)} $p=$kv{$kw{$F[1]}}; print "@F[0,1,$p]" ' ratnesh_in.txt
Apple fruits 30
Car vehicle 50
Book study 70
$
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With