파일 이름에서 값을 추출하여 텍스트 파일에 추가합니다.

파일 이름에서 값을 추출하여 텍스트 파일에 추가합니다.

텍스트 파일에 메쉬 모델 데이터(다른 깊이로 구분됨)가 저장되어 있습니다. 구조는 다음과 같습니다.

체재텍스트 파일 행의 각 열은 다음과 같습니다.

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다음 숫자에만 영향을 미치게 됩니다.

관련 정보