/ / Usando awk per 'media' 2 file di dati - bash, awk

Usando awk per 'media' 2 file di dati - bash, awk

Supponiamo di avere 2 file di dati dat1.txt

1 1
2 2

E dat2.txt

2 2
3 3

Come posso usare awk per "media" questi file e salvarlo in un nuovo file? Quindi in questo caso voglio l'output di un file dat3.txt:

1.5 1.5
2.5 2.5

risposte:

2 per risposta № 1

Questo awk one-liner dovrebbe funzionare:

awk "{n=NF/2;for(i=1;i<=n;i++)
printf "%.1f%s",($i+$(n+i))/2,i==n?RS:FS}" <(paste f1 f2)

0 per risposta № 2

Prova, questo supporta più di due file, puoi inserire file come myfiles*.txt

Ingresso

$ cat f1.txt
1 1
2 2

$ cat f2.txt
2 2
3 3

copione

  awk "
FNR==1{
nf++
nc = NF
}
{
for (i=1; i <= NF; i++)
s[FNR,i] += $i;
if (FNR > mnr) mnr = FNR
}
END {
for (i = 1; i <= mnr; i++)
{
for (c=1; c <= nc; c++)
printf("%s%f", (c>1?OFS:""), s[i,c]/nf);
printf "n"
}
}
" f1.txt f2.txt                        # you can also input f*.txt

Produzione

1.500000 1.500000
2.500000 2.500000

0 per risposta № 3
awk "{for(i=1;i<=NF;i++)Sum[FNR"-"i]+=$i}
END {
for(l=1;l<=NR;l++){
for(i=1;i<=NF;i++) printf( "%2.1f ", Sum[l"-"i]/NR)
printf( "n")
}
}" dat.1 dat.2

Supponendo che entrambi i file abbiano lo stesso numero di righe e argomenti


0 per risposta № 4
$ awk "{a[FNR]+=$1; b[FNR]+=$2}END{for(;++i<=FNR;) print a[i]/(ARGC-1), b[i]/(ARGC-1)}" f1 f2
1.5 1.5
2.5 2.5

Ha spiegato:

{
a[FNR]+=$1                             # sum col values into arrays
b[FNR]+=$2                             # array for each field
}
END {
for(;++i<=FNR;)                        # iterate arrays in ascending order
print a[i]/(ARGC-1), b[i]/(ARGC-1) # and print array contents divided by filecount
}

0 per risposta № 5

Provalo:

awk "FNR==NR{for(i=1;i<=NF;i++){A[FNR,i]=$i};next} {for(j=1;j<=NF;j++){printf("%.2f ",(A[FNR,j]+$j)/2)};print x}" data1.txt data2.txt

Questo codice non è testato con molte permutazioni e combinazioni. Quindi se hai più condizioni e gentilmente faccelo sapere sullo stesso.