我遇到了一个问题,我需要根据文件自己的 SD 从文件中删除行。我尝试过 awk 但还没有弄清楚。
这是输入文件:
A x 50
B y 100
C q 34
D ua 80
我想首先计算第三列的平均值和标准差,这可以通过像这样的命令来完成
awk '{s+=$3; ss+=$3^2} END{print mean=s/NR, SD=sqrt(ss/NR-m^2)}' file
但是,我想根据 SD 进一步删除行 - 例如,我只想要高于平均值 0.5 SD 的行,它会是这样的
awk '$3 > m + 0.5*n' file > fileout
有没有办法将这两个 awk 链接成一个?如果没有的话还有其他方法吗?
非常感谢!
答案1
$ awk 'NR==FNR{ s+=$3; ss+=$3^2; nr=NR; next }
FNR==1 { mean=s/nr; sd=sqrt(ss/nr-mean^2) }
$3> mean+(0.5*sd)' infile infile
B y 100
D ua 80
答案2
我建议你在 python 中使用它:
import pandas as pd
import numpy as np
# Read the input file into a pandas DataFrame
input = pd.read_csv('file', delimiter=' ', header=None)
# Calculate the mean and standard deviation
mean = input[2].mean()
sd = input[2].std()
# Filter rows based on the condition
filtered = df[df[2] > mean + 0.5 * sd]
# Write the filtered DataFrame to an output file
filtered.to_csv('outfile', sep=' ', header=False, index=False)
该代码将文件读入 pandas DataFrame,计算平均值和标准差,根据条件过滤行,最后将过滤后的 DataFrame 写入输出文件。
如果您不熟悉Python,可以复制以下命令并将其粘贴到在线 Python 代码编辑器。
## Prepare your input file
lines = ['A x 50', 'B y 100', 'C q 34', 'D ua 80']
with open('file', 'w') as file:
for line in lines:
file.write(line + '\n')
## The command to remove rows from input based on its SD
import pandas as pd
import numpy as np
# Read the input
input = pd.read_csv('file', delimiter=' ', header=None)
# Calculate the mean and standard deviation
mean = input[2].mean()
sd = input[2].std()
# Filter rows based on your condition
fileout = input[input[2] > mean + 0.5 * sd]
# Print the output
print(fileout)
请注意,此命令将准备输入数据。