Come stampare l'indice del ciclo su un file usando awk?


0

Devo stampare l'indice del ciclo su un file usando awk. Ecco il codice che ho usato.

echo "Write the start and end file number:"
read sta end
echo "$sta" "$end"
for (( c="$sta"; c<="$end"; c++ ))
do
  echo "$c"
  awk '{if (NR < 15 && $8 >0.48 && $8 <0.52 && $9 >0.48 && $9 <0.52 && $10 >0.48 && $10 <0.52) {print $1 " " $8 " " $9 " " $10}}' RD00$c/MergerHalos.out >> center_raw.dat
done

Oltre ai valori della colonna 1,8,9,10, devo scrivere il valore di

c

a center_raw.dat.

Risposte:


3

Non sono sicuro di quale sia il tuo requisito, ma da quello che desidero di seguito sembra essere quello che richiedi:

awk -v var="$c" '{if (NR < 15 && $8 >0.48 && $8 <0.52 && $9 >0.48 && $9 <0.52 && $10 >0.48 && $10 <0.52) {print var ":" $1 " " $8 " " $9 " " $10}}' RD00$c/MergerHalos.out >> center_raw.dat

-vL'opzione di awkè usata per passare il valore della variabile bash esterna all'interno di awk.


2
-v var="$c"passa il valore di $ca var. Ho stampato varin print var ":" $1 " " $8 " " $9 " " $10. Puoi usare vardove vuoi in awk. L'ho usato printsolo per un esempio.
Fazlin,

1

Una rapida riscrittura stilisticamente (più SECCO)

for (( c=sta; c<=end; c++ )); do
    awk -v c=$c '
        NR == 15 {exit}
        function ok(val) {return (0.48 < val && val < 0.52)}
        ok($8) && ok($9) && ok($10) {print c, $1, $8, $9, $10}
    ' RD00$c/MergerHalos.out
done >> center_raw.dat

Dalla mia esperienza nell'uso delle funzioni in awk influisce

0

Potresti fare tutto in awk, penso

 awk '
 function readfile(i){
    file="RD00"i"/MergerHalos.out"
    while ( (getline < file) > 0) {
    if(NR < 15 && $8 >0.48 && $8 <0.52 && $9 >0.48 && $9 <0.52 && $10 >0.48 && $10 <0.52)
            print i":"$1,$8,$9,$10 > center_raw.dat
        }
        close(file)
}

BEGIN{
    sta=ARGV[1]
    end=ARGV[2]
    ARGC=0
    while(end>sta){print end;readfile(end--)}
}' $start $end

Penso che questo potrebbe essere eccessivo però

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.