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 № 1Questo 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.