1. 程式人生 > >shell指令碼實現相關文字和資料夾操作

shell指令碼實現相關文字和資料夾操作

shell指令碼實現某些文字/檔案和資料夾功能.

資料在指令碼的上層資料夾Data內,在scripts資料夾內執行該指令碼,按格式得到需要的event.cat檔案.

在此做一記錄, 以便以後檢視.

#!/bin/bash
#以要求格式生成event.cat
#在資料檔案上一級目錄的srcipts檔案內執行
eventid=(`cut -d' ' -f1 iddir.dat`) #獲取iddir.dat的第一列,地震id,寫入eventid陣列;
echo ${eventid[@]}
evdir=(`cut -d' ' -f2 iddir.dat`) #獲取iddir.dat的第二列,地震事件目錄名,寫入evdir陣列;
echo ${evdir[@]}
length=${#evdir[@]} #獲取陣列長度
echo "$length"

cd ../Data
for file in ./* #遍歷該檔案Data下所有資料夾
do
cd ./$file
path=$PWD
ls >$file.dat  #將檔案中的所有檔案寫入$file.dat
sed -i '1d' ./$file.dat #刪除$file.txt最後一行
echo "$path"
echo "$file"

filename=`echo $file | cut -d \/ -f 2` #將字串$file以/分割,取第2部分(檔名),賦值給filename.
echo "$filename"

#將絕對路徑加到路徑裡,得到$file.dat3
filenm=($(awk '{print $0}' $file.dat))
length2=${#filenm[@]}
for((i=0;i < length2;i++))
do
filename2=`echo ${filenm[i]} | cut -d \/ -f 2`
echo "$path""/""$filename2" >> $file.dat3
done


for((i=0;i < length;i++))
do
if [[ ${evdir[i]} = $filename ]]   #為該資料夾的地震事件尋找匹配的地震ID,賦值給evid.
then
   evid=${eventid[i]}    
   echo "$evid"
fi
done

evlist=($(awk '{print $0}' $file.dat3))
length1=${#evlist[@]}
#將地震ID寫入evid.txt
for(( i=0;i<length1-1;i=i+3))
do
echo "$evid">>evid.dat
done
#將$file.dat3每 3行寫成一行,寫入$file.dat1
for(( i=0;i<length1-1;i=i+3))
do 
echo "${evlist[i]} ${evlist[i+1]} ${evlist[i+2]}" >> $file.dat1 
done

#將臺站名寫入$file.dat2檔案行首
awk -F"." '{print $8,$0}' $file.dat1>$file.dat2
echo "evid: $evid"
#將事件ID寫入$file.dat2檔案第1行和第2行中間
awk '{a="NULL";getline a<"evid.dat";print $1,a,$2,$3,$4}' $file.dat2 >$file.txt
#cp $file* ../
cp *.txt ../../scripts/
rm $file.*
rm *.dat
#rm *.txt

cd .. #返回上級資料夾-Data資料夾
done
  
#將幾個.txt檔案合併為一個檔案event.cat
cd ../scripts
cat *.txt>>event.cat
rm *.txt

經測試,成功執行.