텍스트 파일에 저장된 그리드 모델 데이터(다른 깊이로 구분됨)가 있습니다. 구조는 다음과 같습니다.
체재텍스트 파일 행의 모든 열:
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
다음 숫자에만 영향을 미치게 됩니다.