bash 루프에서 awk

bash 루프에서 awk

여러 파일에 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변수가 채워지는 방식을 조정하세요(예: 생성).outout=FILENAME; sub(/\.txt$/,".out",out)File1.outFile1.txt

그건 그렇고, 내보내지 않은 변수 이름에 모두 대문자를 사용하지 마십시오.Bash 및 쉘 스크립트 변수의 올바른 대문자 사용.

관련 정보