이것은 잘못된 것입니다:
for f in a*.dat; do
awk '.....' file1 "$f" > temp
awk '.....' temp > "$f_out"
done
a*.dat를 입력으로 사용한 다음 접미사 _out을 사용하여 출력으로 사용하고 싶습니다. 매우 감사합니다
답변1
은 _
변수 이름의 일부로 간주되므로 및 추가 f_out
대신 해당 변수를 사용합니다 . 사용하면 문제가 해결됩니다.f
out
{}
for f in a*.dat; do
awk '.....' "$f" > "${f}_out"
done
답변2
$f
변수를 문자열의 나머지 부분 과 구분하려면 중괄호를 사용해야 합니다 (_out
).즉,
$f_out
명명된 변수f_out
(존재하지 않을 수 있으므로 빈 문자열로 평가됨)를 참조하고, 연결된${f}_out
변수의 값을 나타냅니다.f
_out
awk 스크립트가 수행하는 작업에 따라 아마도 (거의 확실하게) 두 번 실행할 필요가 없을 것입니다. 다음과 같이 한 스크립트의 출력을 다른 스크립트로 파이핑하는 데
awk
거의 쓸모가 없습니다 .awk
awk
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