텍스트 파일에 메쉬 모델 데이터(다른 깊이로 구분됨)가 저장되어 있습니다. 구조는 다음과 같습니다.
체재텍스트 파일 행의 각 열은 다음과 같습니다.
x_coordinate y_coordinate density
각 텍스트 파일에는 약 400*400개의 포인트가 있습니다(특정 깊이의 평면으로).
파일 이름:
dep###
여기서 는 ###
깊이(Z 방향)를 나타내는 숫자입니다. 숫자는 정수 또는 분수일 수 있습니다. 예를 들어, 이제 "dep0", "dep0.5", "dep10", "dep300"이라는 파일이 있습니다. 이는 이러한 데이터가 깊이가 0, 0.5인 xy 평면 형태의 400*400 그리드 데이터임을 의미합니다. 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주기마다 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
다음 숫자에만 영향을 미치게 됩니다.