Bash

通過平均一列來移動文件/表格

  • July 25, 2017

我有以下程序,如果第四列的第一行的值是最高的(與具有相同命名樣式的其他 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)和文件名
  • 最後我們列印最後一個文件的平均值

引用自:https://unix.stackexchange.com/questions/242846