파일 이름 패턴 "_base.txt"와 일치하는 파일의 내용을 대문자로 바꾼 다음 원래 파일 이름과 "_cap.txt"를 함께 사용하여 결과를 다른 폴더에 출력해 보세요.
3,000개의 파일로 이 작업을 수행할 계획입니다. 그래서 지금 몇 가지 파일에 대해 테스트하고 있습니다.
첫째, 내용을 자본화할 수 있었습니다. 그러나 출력 결과는 리디렉션되지 않습니다.
BASE="/home/dir/input/"
find "$BASE" -type f -iname "*.txt" -exec awk '{print toupper($0)}' {} +
그런 다음 다음을 추가하여 "_cap.txt"로 끝나는 새 파일 이름으로 출력할 수 있었습니다.
BASE="/home/dir/input/"
find "$BASE" -type f -iname "*_pv_bind_basefile.txt" -exec awk '{print toupper($0) >> (FILENAME "_cap.txt")}' {} +
특정 폴더에 출력하려고 하면 문제가 발생합니다
BASE="/home/dir/input/"
OUT_FOLDER="/home/dir/output/"
find "$BASE" -type f -iname "*_pv_bind_basefile.txt" -exec awk '{print toupper($0) >> ($OUT_FOLDER FILENAME "_cap.txt")}' {} +
다음과 같은 오류 메시지가 나타납니다.
awk: 잘못된 필드 $(), 이름 "OUT_FOLDER" 입력 레코드 번호 1, 파일 /home/dir/input/TAB1.a1.001.txt 소스 줄 번호 1
파일을 출력하기 위해 몇 번의 반복을 시도했지만 몇 시간 후에 비참하게 실패했습니다... 제가 간과하고 있거나 어떻게 해야 할지 모르는 간단한 일임에 틀림없습니다. 어떤 조언이라도 대단히 감사하겠습니다. 감사해요.
답변1
쉘 변수와 Awk 변수는 서로 다릅니다.
변수를 환경으로 내보내면 ENVIRON
awk의 배열을 통해 액세스할 수 있으므로 이렇게 할 수 있습니다(참고: find
질문의 핵심이 아니기 때문에 생략했습니다)
export OUT_FOLDER="/home/dir/output/"
awk '{print toupper($0) >> ENVIRON["OUT_FOLDER"] FILENAME "_cap.txt"}'
-v
또는 옵션을 사용하여 변수를 전달할 수 있습니다.
OUT_FOLDER="/home/dir/output/"
awk -v out_folder="$OUT_FOLDER" '{print toupper($0) >> out_folder FILENAME "_cap.txt"}'