我有一個網格模型資料(按不同深度分隔)保存在文字檔案中。結構是這樣的:
格式文字檔案中一行中的每一列:
x_coordinate y_coordinate density
每個文字檔案中大約有400*400個點(作為一定深度的平面)。
檔案名稱:
dep###
這裡,###
是一個代表深度(Z 方向)的數字。該數字可以是整數或分數。例如,現在我有這些檔案:“dep0”、“dep0.5”、“dep10”、“dep300”,這意味著這些資料是xy 平面形式的400*400 網格數據,深度為0、0.5、10和300.
現在,我想選取檔案名稱中的數字(又稱深度)並將其新增至每行的第三列,將它們全部組合在一起。此外,深度應從最小值到最大值排序。所以輸出檔案應該如下所示(例如):
x_coordinate y_coordinate z_coordinate density
0 0 0 2.5
0 1 0 2.5
... ... 0 2.6
400 400 0 2.9
0 0 0.5 2.8
... ... 0.5 2.9
0 0 10 3.2
... ... 10 3.3
... ... 300 4.7
... ... 300 4.8
起初我是用這個腳本來做的:
for((i=$depmin;i<=$depmax;i++))
do
if [ -f "xyp/dep"$i ];then
awk '{print $1, $2,'$i',$3}' "xyp/dep"$i >> "xyzp/area1"
fi
done
然後我發現它會錯過任何深度不是整數的文件,因為變數$i每輪循環中for
增加1。
我嘗試過使用sed
and find -exec
,但我不斷收到錯誤。對我來說,困難在於我不太明白如何正確使用$
, ''
,<<<
將值重定向或通過管道傳遞到awk
或其他函數。請幫我解決這個問題。
=====================
我想出了這個腳本:
depnumbers=$(ls xyp | sed -e 's/dep//g' |sort -n)
filecount=$(ls xyp | wc -l)
for((i=1;i<=$filecount;i++))
do
dep=$(awk '{print $'$i'}' <<< $depnumbers)
awk '{print $1, $2,'$dep',$3}' "xyp/dep"$dep >> "xyzp/area1"
done
它工作得很好。對於此類任務,有什麼方法可以簡化或改進此腳本嗎?實際上我是 bash 的新手,但仍然認為有些問題...不確定
答案1
僅用於將數字新增至文件。
awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' xyp/dep* > "xyzp/area1"
用於按數字排序。
ls -1v xyp/dep* | xargs awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' > "xyzp/area1"
用於從負數排序。
ls xyp/dep* | sort -t 'p' -k 3 -n | xargs awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' > "xyzp/area1"
這會將字元視為p
分隔符,並使函數sort -n
只影響後面的數字。