Dear all,
I am a new user of the forum and of awk.
I have the same problem:
I have a file in the following format:

Si -7.87760000 6.16710000 16.80090000
Si -2.20190000 8.96480000 18.80290000
Si -3.91340000 6.18110000 16.79500000
Si -5.89320000 3.44010000 18.81540000
Si -5.89980000 7.45760000 17.18100000
H -7.84830000 0.67980000 16.84620000
H -7.86760000 4.81220000 18.78920000
Si 2.20250000 8.96490000 18.80280000
Si -0.00010000 6.26880000 16.82620000
Si -1.94640000 3.46010000 18.83720000
H -1.99140000 7.62480000 16.81710000
Si -3.91150000 0.68930000 16.84840000
Si -3.92500000 4.81880000 18.78390000
Si -5.88640000 -2.06440000 18.85090000
H -5.88640000 2.06580000 16.83280000
Si -7.86620000 -4.81050000 16.89460000
Si -7.84800000 -0.67730000 18.83550000
Si 3.91310000 6.18150000 16.79530000
Si 1.94640000 3.46000000 18.83770000
Si 1.99110000 7.62510000 16.81700000

I would like to substitute in a random way the symbol "Si" with the symbol "Ge" in the first column. This substitution should not happen when the line contains the symbol H. I have tried to start with this script, but it doesn't work:

#!/usr/bin/awk -f

#

# Usage:

# ./impurity_gen.awk -v NIMP=12 -v SYMB=Ge

#



BEGIN{

natom=16;
### this is the total number of lines containing the symbol "Si"
nimp=NIMP;
### this the number of lines I would like to substitute
symb=SYMB;
### this is the symbol with whom I'd like to substitute Si
srand()

for (j = 1; j <= nimp; ++j) {

# loop to find a not-yet-seen selection

do {

select = 1 + int(rand() * natom)

} while (select in pick)

pick[j] = select

}

}



NF != 4 { next }



which_Si = 0

symb_tmp = $1



if ( /Si/ ) {

which_Si += 1

do {

symb_tmp=symb

} while ( which_Si in pick )



x=$2; y=$3; z=$4;

printf "%5s %15.9f %15.9f %15.9f \n", symb, x, y, z

}

Please can you give any suggestions or solutions to this problem???
Thank you very much in advance
Reply With Quote