.dat 파일이 많이 있는데 이를 .sac 파일(일종의 지진계 파일)로 변환하고 싶습니다. xy2sac 프로그램을 사용하여 파일을 변환했지만(코드를 작성하지는 않았습니다) 변환된 파일에 원하는 새 이름을 지정해야 했습니다.
변환기 코드는 다음과 같이 작동합니다.
xy2sac filename.dat newfilename.sac
내가 하고 싶은 것은 xy2sac 프로그램이 루프에서 작동하는 동안 새 파일 이름을 지정하는 것입니다. 예를 들어 내 dat 파일 이름은 다음과 같습니다.
BRGA_KO_disp_post_mij_conv0000_E.dat
BRGA_KO_disp_post_mij_conv0000_E.dat
BRGA_KO_disp_post_mij_conv0000_N.dat
BRGA_KO_disp_post_mij_conv0000_Z.dat
GADA_KO_disp_post_mij_conv0000_E.dat
GADA_KO_disp_post_mij_conv0000_N.dat
GADA_KO_disp_post_mij_conv0000_Z.dat
HYBL_KO_disp_post_mij_conv0000_E.dat
HYBL_KO_disp_post_mij_conv0000_N.dat
HYBL_KO_disp_post_mij_conv0000_Z.dat
ISK_KO_disp_post_mij_conv0000_E.dat
ISK_KO_disp_post_mij_conv0000_N.dat
ISK_KO_disp_post_mij_conv0000_Z.dat
TUZL_KO_disp_post_mij_conv0000_E.dat
TUZL_KO_disp_post_mij_conv0000_N.dat
TUZL_KO_disp_post_mij_conv0000_Z.dat
이름을 다음으로 변경하고 싶습니다.
BRGA_KO__E.sac
BRGA_KO__E.sac
BRGA_KO__N.sac
BRGA_KO__Z.sac
GADA_KO__E.sac
GADA_KO__N.sac
GADA_KO__Z.sac
HYBL_KO__E.sac
HYBL_KO__N.sac
HYBL_KO__Z.sac
ISK_KO__E.sac
ISK_KO__N.sac
ISK_KO__Z.sac
TUZL_KO__E.sac
TUZL_KO__N.sac
TUZL_KO__Z.sac
그래서 .dat 앞의 처음 8자와 마지막 문자를 선택하고 싶습니다.
어떻게 해야 하나요?
이 루프를 사용했지만 작동하지 않았고 결국 .dat 파일 확장자가 생겼습니다.
foreach file (`ls *.dat*`)
xy2sac *.dat *.sac << END
END
end
미리 감사드립니다.
답변1
csh
더 정상적인 쉘로 변경할 :s
수 없다면
전임자.
#!/bin/csh -f
foreach file ( *.dat )
echo xy2sac $file $file:s/disp_post_mij_conv0000//:s/.dat/.sac/
end
echo
파일 이름이 정확하다고 확신하면 삭제하십시오.
답변2
경고: 나는 당신이 csh를 사용하고 있다는 것을 몰랐기 때문에 내 대답은 bash에만 적용됩니다. 이것이 옵션이 아닌 경우 다른 답변에서 사용 가능한 솔루션을 제공합니다.
=~
배열 과 함께 연산자를 사용하여 BASH_REMATCH
파일 이름의 일부를 일치시키고 이를 새 파일 이름으로 결합할 수 있습니다 .
#!/bin/bash
for file in *.dat
do
if [[ $file =~ ([A-Z]+_[A-Z]+_).*(..)\.dat ]]
then
xy2sac $file ${BASH_REMATCH[1]}${BASH_REMATCH[2]}.dac
fi
done
그런데 요구 사항과 예제가 일치하는지 확인해야 실제로 무엇을 의미하는지 추측할 필요가 없습니다. 실제로 명령에 빈 here 문서를 입력해야 하는지는 확실하지 않습니다. 귀하의 예와 일치하도록 코드를 작성했지만 일치하는 첫 번째 부분이 항상 8자는 아니며 _
마지막 문자뿐만 아니라 .dat(포함) 앞의 마지막 두 문자를 의미했습니다.
답변3
한 가지 제안: awk를 사용하여 "_" 및 "."을 쉽게 잘라내고 새 파일 이름을 만들려는 부분에 쉽게 액세스하세요.
당신이라면 어떨까요?틀림없이모든 *.dat 파일은 언급한 정확한 구조를 갖습니다(예: 공백이 없으며 항상 6개의 "_", 1개의 "."만 있는 등).
# solution with awk, which can easily define fields using a regex
# (here: "[_.]" so that either 1 "_" or 1 "." separates one field from the next)
# awk will check we presented a filename with the correct number of fields, and also
cd /correct/directory || exit 1 # ie, go to the right directory containing your .dat files, or exit
find ./ -name '*.dat' -print \
| awk -F'[_.]' -v nbfield=8 '
( NF != nbfield ) {
print "Error: file " $0 " ignored: does not have the right structure." ;
next;
}
( NF == nbfield ) {
print "converting file: " $0 " ..."
system("echo _remove_echo_when_ok_ xy2sac " $0 " " $1"_"$2"__"$(NF-1)".sac && echo OK || echo ___ko___ ")
}
'
물론, 그것이 작동한다고 생각한다면: "echo _remove_echo_when_ok_ xy2sac "
(표시만 하고 xy2sac를 실행하지는 않음)을 "xy2sac "
(실행할 것입니다) 로 바꾸십시오.