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

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

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

체재텍스트 파일 행의 모든 ​​열:

x_coordinate y_coordinate density

모든 텍스트 파일에는 약 400*400개의 포인트가 있습니다(특정 깊이의 평면으로).

파일 이름:

dep###

여기서 ###숫자는 깊이(Z 방향)를 나타냅니다. 숫자는 정수 또는 분수일 수 있습니다. 예를 들어, 이제 "dep0", "dep0.5", "dep10", "dep300" 파일이 있습니다. 이는 해당 데이터가 깊이 0, 0.5, 10 및 xy 평면 형식의 400*400 격자 데이터임을 의미합니다. 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루프에서는 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다음 숫자에만 영향을 미치게 됩니다.

관련 정보