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 루프 구성이 지원되지 않는 sh
POSIX bourne 쉘에서 이것을 실행하고 있다고 생각합니다 .((
bash
스크립트를 실행하고 shebang을 설치 경로로 설정합니다. #!/usr/bin/env bash
검색이 항상 가능한 것은 아니므 로 일반적으로 이렇게 하는 것이 안전합니다. #!/usr/bin/env
특히 Linux가 아닌 시스템에서는 더욱 그렇습니다. OpenBSD 시스템의 경우 .PATH
bash
bash
/bin
/usr/local/bin
답변2
스크립트는 /bin/sh
( bash
또는 ksh93
C와 유사한 루프를 이해하는 다른 쉘 )에 의해 for
해석될 가능성이 높습니다.
스크립트에 #!
다음과 같은 줄이 있는지 확인하십시오.
#!/bin/bash
파일 맨 위에서(사용하려는 셸과 경로로 변경) 또는 올바른 인터프리터를 사용하여 스크립트를 명시적으로 실행합니다. 예:
bash ./scriptname
답변3
ㅏ3개 매개변수 루프 제어 표현존재하다세게 때리다다음과 같이 지정해야 합니다.
for (( EXP1; EXP2; EXP3 ))
그러나 간단한 경우에는 다음을 사용합니다.
for i in {2..4}; do ...
답변4
완전성을 기하기 위해 ksh93-syntax 명령에 해당하는 POSIX는 다음과 같습니다 (따라서 sh
귀하를 포함하는 모든 최신 ash
쉘 dash
또는 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"