여러 파일에 awk를 적용하는 방법은 무엇입니까? 다음 스크립트는 아무 작업도 수행하지 않습니다.
FILE=/media/linux/*.txt
for f in $FILES
do
awk '{printf("%.4f %8.2f 1.000 1 1\n", $2, $4)}' $f > test$f.out
done
답변1
FILE=
(단수)와 (복수) 가 있습니다 for f in $FILES
. 그 외에도 echo
다음 두 명령문의 출력 차이를 살펴보세요 .
$ ls tmp
File-0 File-1 File-2 File-3
$ files=tmp/File*
$ echo "$files"
tmp/File*
$ files=( tmp/File* )
$ echo "${files[@]}"
tmp/File-0 tmp/File-1 tmp/File-2 tmp/File-3
다음을 사용하여 첫 번째 코드 부분에서 파일 목록을 가져올 수 있습니다.
$ files=tmp/File*
$ echo $files
tmp/File-0 tmp/File-1 tmp/File-2 tmp/File-3
그러나 문제/경고와 관련된 따옴표가 없는 변수를 도입합니다.https://mywiki.wooledge.org/Quotes.
따라서 어떤 이유로 루프를 작성하려면 다음과 같이 하세요.
files=( tmp/File* )
for f in "${files[@]}"; do
awk 'script' "$f"
done
또는 루프 없이 이 작업을 수행할 수 있습니다.
files=( tmp/File* )
awk 'script' "${files[@]}"
그렇지 않으면:
awk 'script' tmp/File*
비루핑 명령을 사용하여 각 입력 파일에 대해 고유한 출력 파일을 제공하려는 경우:
awk 'FNR==1{close(out); out=FILENAME ".out"} {print > out}' tmp/File*
File1.txt.out
그러면 입력 파일에서 출력 파일이 생성됩니다 . 다른 명명 변환을 원하는 경우 File1.txt
변수가 채워지는 방식을 조정하세요(예: 생성).out
out=FILENAME; sub(/\.txt$/,".out",out)
File1.out
File1.txt
그건 그렇고, 내보내지 않은 변수 이름에 모두 대문자를 사용하지 마십시오.Bash 및 쉘 스크립트 변수의 올바른 대문자 사용.