awk에서 루프의 파일을 입력/출력 파일로 사용하는 방법은 무엇입니까?

awk에서 루프의 파일을 입력/출력 파일로 사용하는 방법은 무엇입니까?

이것은 잘못된 것입니다:

for f in a*.dat; do 
    awk '.....' file1 "$f" > temp
    awk '.....' temp > "$f_out"
done

a*.dat를 입력으로 사용한 다음 접미사 _out을 사용하여 출력으로 사용하고 싶습니다. 매우 감사합니다

답변1

_변수 이름의 일부로 간주되므로 및 추가 f_out대신 해당 변수를 사용합니다 . 사용하면 문제가 해결됩니다.fout{}

for f in a*.dat; do 
    awk '.....' "$f" > "${f}_out"
done

답변2

  1. $f변수를 문자열의 나머지 부분 과 구분하려면 중괄호를 사용해야 합니다 ( _out).

    즉, $f_out명명된 변수 f_out(존재하지 않을 수 있으므로 빈 문자열로 평가됨)를 참조하고, 연결된 ${f}_out변수의 값을 나타냅니다.f_out

  2. awk 스크립트가 수행하는 작업에 따라 아마도 (거의 확실하게) 두 번 실행할 필요가 없을 것입니다. 다음과 같이 한 스크립트의 출력을 다른 스크립트로 파이핑하는 데 awk거의 쓸모가 없습니다 .awkawk

    awk '.....' file1 "$f" > temp
    awk '.....' temp > "${f}_out"
    

    실제로는 다음과 같습니다.

    awk '.....' file1 "$f" | awk '.....' > "${f}_out"
    

    다음과 같이 작성하는 것이 좋습니다.

    awk '{....}; {.....}' "$f" > "${f}_out"
    

    루프에서:

    for f in *.dat; do
      awk '{....}; {.....}' "$f" > "${f}_out"
    done
    

그런데 awk현재 처리 중인 파일의 파일 이름과 동일한 "FILENAME"이라는 내장 변수가 있습니다. 즉, 루프가 필요하지 않을 수도 있습니다 for. 다음을 수행하세요.

   awk '{....}; { .... }; { print > FILENAME "_out" }' a*.dat

아니면 모든 print 문이 로 끝나는지 확인하세요 > FILENAME "_out".

이 두 스크립트의 기능을 정확히 알지 못하면 이보다 더 구체적으로 설명할 수 없습니다 awk.

답변3

명령은 다음과 같아야 합니다.

for f in a*.dat; do 
    awk '.....' "$f" > "${f}_out"
done

출력은 이런 식이어야 합니다. 그렇지 않으면 쉘이 변수를 해석하려고 시도합니다.

f_out

관련 정보