グリッド化されたモデル データ (異なる深度で区切られている) がテキスト ファイルに保存されています。構造は次のようになります。
フォーマットテキスト ファイル内の行の各列:
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
後続の数字にのみ影響するようになります。