쉘 스크립트의 루프에서 awk를 실행하려고 할 때 "구문 오류: 루프 변수 오류" 발생

쉘 스크립트의 루프에서 awk를 실행하려고 할 때 "구문 오류: 루프 변수 오류" 발생

awk터미널에서 잘 작동하는 명령이 있습니다 . awk열 머리글을 기반으로 다른 파일을 생성합니다. awk 명령:

for((i=2;i<5;i++)); do 
    awk -v i=$i 'BEGIN{OFS=FS="\t"}NR==1{n=$i}{print $1,$i > n".txt"}' ${Batch}.result.txt
done

쉘 스크립트에 병합하면 동일한 명령이 오류를 표시합니다.

Syntax error: Bad for loop variable

작동 방식은 다음과 같습니다. 제안된 대로 she-bang을 사용해 보았지만 오류가 반복되었습니다.

for i in 2 3 4; do awk -v i=$i 'BEGIN{OFS=FS="\t"}NR==1{n=$i}{print $1,$i  n".txt"}'

답변1

나는 오류가 귀하의 명령과 Awk관련이 없다고 생각합니다. for 루프 구성이 지원되지 않는 shPOSIX bourne 쉘에서 이것을 실행하고 있다고 생각합니다 .((

bash스크립트를 실행하고 shebang을 설치 경로로 설정합니다. #!/usr/bin/env bash검색이 항상 가능한 것은 아니므 로 일반적으로 이렇게 하는 것이 안전합니다. #!/usr/bin/env특히 Linux가 아닌 시스템에서는 더욱 그렇습니다. OpenBSD 시스템의 경우 .PATHbashbash/bin/usr/local/bin

답변2

스크립트는 /bin/sh( bash또는 ksh93C와 유사한 루프를 이해하는 다른 쉘 )에 의해 for해석될 가능성이 높습니다.

스크립트에 #!다음과 같은 줄이 있는지 확인하십시오.

#!/bin/bash

파일 맨 위에서(사용하려는 셸과 경로로 변경) 또는 올바른 인터프리터를 사용하여 스크립트를 명시적으로 실행합니다. 예:

bash ./scriptname

답변3

3개 매개변수 루프 제어 표현존재하다세게 때리다다음과 같이 지정해야 합니다.

for (( EXP1; EXP2; EXP3 ))

그러나 간단한 경우에는 다음을 사용합니다.

for i in {2..4}; do ...

답변4

완전성을 기하기 위해 ksh93-syntax 명령에 해당하는 POSIX는 다음과 같습니다 (따라서 sh귀하를 포함하는 모든 최신 ashdash또는 busybox 기반 구현 에서 작동합니다).ash

i=2; while [ "$i" -lt 5 ]; do
  awk -v i="$i" '
    BEGIN{OFS=FS="\t"}
    NR==1{n=$i}
    {print $1,$i > n".txt"}' < "${Batch}.result.txt"
  i=$((i + 1))
done

여기서는 다음과 같이 작성하는 것이 더 합리적입니다.

awk -F '\t' -v OFS='\t' '
  NR == 1 {for (i = 2; i < 5; i++) file[i] = $i".txt"}
  {for (i = 2; i < 5; i++) print $1,$i > file[i]}' < "${Batch}.result.txt"

관련 정보