首页 > 解决方案 > linux中多个文件或每三行的平均广告标准偏差

问题描述

我的操作系统是 windows 10,我在 windows 上使用 bash 来执行 linux 命令。我有一个包含 96 行的文件,我有多个文件覆盖了该文件的每三行,我想将它们的均值和标准差逐行添加到单个文件中。

单个文件

1 31.31
2 32.24
3 32.11
4 20.97
5 20.93
6 20.91
7 22.58
8 22.46
9 22.52
10 20.71
11 20.25
12 20.51

文件 1

1 31.31
2 32.24
3 32.11

文件 2

4 20.97
5 20.93
6 20.91

文件 3

7 22.58
8 22.46
9 22.52

首先,我尝试将具有详细模式的文件拆分为多个文件

grep -i 'Sample' Sample3.txt | awk '{print $5, $6}' | sed 's/\,/\./g' >> Sample4.txt | split -l3  Sample4.txt --verbose

像 foreach 和 awk 这样的 tcsh 命令可以用于 bash 脚本吗?我们可以在单个文本文件中执行此操作,还是必须将该单个文件拆分为文件?

例如输出可以是:

输出.txt

mean      stand.D.
31.88667  0.50362      ----- first three rows mean and sd
20.93667  0.030        ----- second three rows mean and sd
22.52     0.06         ----- third three rows  mean and sd
etc       etc                etc 

标签: windowsbash

解决方案


使用这个 awk 脚本怎么样?

BEGIN {
  avg=0; j=0
  fname = "file_output.txt"
  printf "mean\t stand.D\n" > fname
}

{
  avg = avg + $2
  values[j] = $2
  j = j + 1
  if (NR % 3 == 0) {
    printf "%f\t", avg/3 > fname
    sd = 0
    for (k = 0; k < 3; k++) {
      sd = sd + (values[k]-avg/3)*(values[k]-avg/3)
    }
    printf "%f\n", sqrt(sd/3) > fname
    avg = 0; j = 0
  }
}

输出:

mean     stand.D
31.8867 0.411204
20.9367 0.0249444
22.52   0.0489898
20.49   0.188326

“Bash 脚本”(foo.sh):

#!/bin/bash

# data.txt is Single File
awk -F " " -f script.awk data.txt

推荐阅读