從檔案名稱中提取值並將其新增至文字檔案中

從檔案名稱中提取值並將其新增至文字檔案中

我有一個網格模型資料(按不同深度分隔)保存在文字檔案中。結構是這樣的:

格式文字檔案中一行中的每一列:

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。

我嘗試過使用sedand 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只影響後面的數字。

相關內容