프로그램이 cshell의 루프에서 작동할 때 새 파일 이름을 어떻게 지정합니까?

프로그램이 cshell의 루프에서 작동할 때 새 파일 이름을 어떻게 지정합니까?

.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 "(실행할 것입니다) 로 바꾸십시오.

관련 정보