awk exec 결과를 다른 폴더로 리디렉션 [중복]

awk exec 결과를 다른 폴더로 리디렉션 [중복]

파일 이름 패턴 "_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 변수는 서로 다릅니다.

변수를 환경으로 내보내면 ENVIRONawk의 배열을 통해 액세스할 수 있으므로 이렇게 할 수 있습니다(참고: 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"}'

관련 정보