テキストファイルにメッシュモデルデータ(異なる深さで区切られています)が格納されています。構造は次のとおりです。
滞在テキストファイル行の各列は次のとおりです。
x_coordinate y_coordinate density
各テキストファイルには約400×400のポイントがあります(特定の深さの平面で)。
ファイル名:
dep###
ここでは、###
深さ(Z方向)を表す数字です。数値は整数または小数のいずれかです。たとえば、「dep0」、「dep0.5」、「dep10」、「dep300」というファイルがあります。これは、これらのデータが、深さ0、0.5のxy平面の形で400 * 400グリッドデータであることを意味します。 10と300。
これで、ファイル名(深さとも呼ばれる)の数字を取得し、各行の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サイクルごとに1ずつ増加しますfor
。
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
次の数字にのみ影響します。