자체 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.5SD 높은 행만 원하면 다음과 같습니다.
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)
이 명령은 입력 데이터를 준비합니다.