네 번째 열의 첫 번째 행에 있는 값이 (동일한 이름 지정 스타일을 가진 다른 8개 파일과 비교하여) 가장 높은 경우 파일(실제로는 테이블)을 이동할 수 있는 다음 프로그램이 있습니다. 스크립트는 다음과 같습니다.
#! /bin/bash
river=mississippi
highest=1
for model in H08 MPI-HM WBM PCR-GLOBWB
do
for gcm in GFDL-ESM2M HadGEM2-ES IPSL-CM5A-LR MIROC-ESM-CHEM NorESM1-M
do
for scenario in hist rcp8p5 rcp4p5
do
RESULT=$(awk 'FNR==1 {print $4, FILENAME}' ${model}_${gcm}_${scenario}_${river}[1-9]/${model}_${gcm}_${scenario}_${river}[1-9].txt | sort -n -r| head -1)
highest="$(echo $RESULT | cut -d ' ' -f1 )"
hifile="$(echo $RESULT | cut -d ' ' -f2 )"
echo "highest was $highest in $hifile"
cp "$hifile" "/home/stevens/SUMARIO/Fred/highest_discharge/${river}/${model}_${gcm}_${scenario}_${river}.txt"
done
done
done
그런 다음 가장 높은 값(첫 번째 행, 네 번째 열)을 가진 파일을 복사하는 대신 네 번째 열, 동일한 열에 가장 높은 평균을 가진 파일을 복사하는 방식으로 이 스크립트를 조정하고 싶습니다. 다른 파일과 비교하십시오. 어떤 팁이나 제안이라도 대단히 감사하겠습니다!
답변1
결과 계산 방법을 변경하면 됩니다.
RESULT=$(awk '{x+=$4} END{print x/NR, FILENAME}' ${model}_${gcm}_${scenario}_${river}[1-9]/${model}_${gcm}_${scenario}_${river}[1-9].txt | sort -n -r| head -1)
위의 내용은 네 번째 행의 모든 값을 더하고 마지막 행 수로 나눈 결과를 인쇄하는 것입니다.
줄 수로 나누기 때문에 파일에 빈 줄이 있으면 예상치 못한 결과가 발생합니다. 합계는 이를 고려하지 않고 줄 수로 나눕니다.
편집하다:
첫 번째 시도에서 스크립트가 마지막 파일의 최대값만 고려하도록 하는 오류가 발생했습니다.모두파일이 처리되었습니다)
올바른 버전:
awk 'FNR==1 && NR>1 {print x/nr, file;x=0}{x+=$4; nr=FNR; file=FILENAME} END{print x/nr, file, x, nr}' ${model}_${gcm}_${scenario}_${river}[1-9]/${model}_${gcm}_${scenario}_${river}[1-9].txt | sort -n -r| head -1
설명하다:
- 인쇄할 때마다더 일찍파일이 구문 분석되었습니다. 새 파일을 읽을 때마다 FNR이 재설정되므로 새 파일이 시작되었는지(FNR == 1) 확인하고 첫 번째 파일에 있지 않은지(NR > 1) 확인합니다. 그렇다면 이전 파일에서 저장된 평균과 파일 이름을 인쇄합니다. x도 재설정합니다(평균을 유지합니다).
- 그렇지 않으면 x 계산을 시작합니다. 또한 파일(FNR)의 레코드 수와 파일 이름을 저장합니다.
- 마지막으로 마지막 파일의 평균을 인쇄합니다.
답변2
열 자체의 위치를 지정하는 방법을 알아낸 것 같습니다. 이제 해야 할 일은 4개 파일 모두의 4번째 열의 평균을 구하고 평균이 가장 높은 파일을 복사하는 것입니다(이미 말한 내용을 다시 언급하면 됩니다).
기본적으로 해야 할 일은 4개 파일 각각의 4열 출력을 더한 다음 4열의 행 수로 나누어 평균을 구하는 것입니다. 그런 다음 평균이 가장 높은 파일을 복사합니다.
평균을 구하는 방법만 알고 싶으신 것 같은데요, 그렇죠?
echo "$file1_col4" | wc -l
wc -l <<< "$file1_col4"
이미 가지고 있어야 하는 or 와 같은 작업을 수행하여 행 수를 쉽게 얻을 수 있습니다 . 나중에 나눌 수 있도록 각 값을 변수에 저장합니다. 그럼 다음과 같이 말해보자:
file1_col4_rows=$(echo "$file1_col4" | wc -l)
이 열의 합계를 얻으려면 다음을 수행해야 합니다.
file1_col4_total=$(echo "$file1_col4" | awk '{total = total + $1}END{print total}')
4개 파일 모두에 대해 이 작업을 수행하고 이전에 변수로 설정한 열의 총 행 수로 나눌 수 있습니다. Bash에는 이를 처리하는 내장 기능이 있지만 저는 다음을 사용하는 것을 선호합니다 perl
.
file1_avg=$(perl -e "print $file1_col4_total/$file1_col4_rows")
4개 파일 모두에 대해 이 작업을 수행하면 변수를 참조하여 평균 4번째 열이 가장 높은 파일을 쉽게 확인한 $fileN_avg
다음 가장 높은 값을 가진 변수가 있는 파일을 복사할 수 있습니다.
file_to_copy="$(echo "file1 $file1_avg
file2 $file2_avg
file3 $file3_avg
file4 $file4_avg" |
sort -nrk2 |
head -1 |
awk '{print $1}')"
그리고 나서 간단히cp "$file_to_copy" /path/where/it/belongs/