Bash
通過平均一列來移動文件/表格
我有以下程序,如果第四列的第一行的值是最高的(與具有相同命名樣式的其他 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
然後,我想以這樣的方式調整這個腳本,而不是複制具有最高值的文件(在第一行,第四列),我想複製在第四列具有最高平均值的文件,在與其他文件進行比較。非常感謝任何提示或建議!
只需更改計算結果的方式:
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)
上面的作用:它總結了第四行的所有值,並在最後列印結果除以行數。
因為它除以行數,所以如果文件中有空行,您會得到意想不到的結果:總和不會考慮這些,但除以行數。
編輯:
我在第一次嘗試時出錯,導致腳本只考慮最後一個文件的最大值(因為 END 在處理完所有文件後執行)
正確版本:
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)和文件名
- 最後我們列印最後一個文件的平均值