ファイル名から値を抽出し、テキストファイルに追加します

ファイル名から値を抽出し、テキストファイルに追加します

グリッド化されたモデル データ (異なる深度で区切られている) がテキスト ファイルに保存されています。構造は次のようになります。

フォーマットテキスト ファイル内の行の各列:

x_coordinate y_coordinate density

各テキスト ファイルには約 400 x 400 個のポイントがあります (特定の深さの平面として)。

ファイル名:

dep###

ここで、###数字は深さ (Z 方向) を表します。数字は整数または分数にすることができます。たとえば、現在、次のファイルがあります: "dep0"、"dep0.5"、"dep10"、"dep300"。これは、これらのデータが、深さ 0、0.5、10、および 300 の xy 平面形式の 400*400 グリッド データであることを意味します。

ここで、ファイル名の数字 (つまり深度) を取り出し、各行の 3 番目の列に追加して、すべてを結合します。また、深度は最小値から最大値まで並べ替える必要があります。したがって、出力ファイルは次のようになります (例):

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とを使用しようとしましたが、エラーが発生し続けました。私にとって難しいのは、 、、 を正しく使用して値を または他の関数にリダイレクトまたはパイプする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後続の数字にのみ影響するようになります。

関連情報